AWK输出到分离的文件



我正试图根据文件所包含的模式来拆分文件,并使用该模式将它们存储为单独的文本文件。

我使用AWK通过两个不同的分隔符("\t&"_&"(分割我的行,并使用$2作为文件名,并将该行($0(附加到生成的相关文件中。

我的命令是:

awk 'BEGIN {FS="[_ t]"}; {fn=$2"_HP100.txt"}; {print $0 >fn}' my_file.txt

Awk可以生成以我的$2命名的文本文件,当我单独打印时,它也可以将$0作为整行。但是我生成的文本文件总是空的。。。我是不是错过了什么?

我的文本文件包含:

K00295:342:HNYVTBBXY:5:1101:1773:1578_CGTCGCCATCGCTAGG    0    12    115297976    24    51M
K00295:342:HNYVTBBXY:5:1101:1834:1578_TCGAACGACCGTTGCG    16    2    22709262    42    50M
K00295:342:HNYVTBBXY:5:1101:1935:1578_GCCTATTCCCTCGTTG    16    18    54707729    42    51M
K00295:342:HNYVTBBXY:5:1101:1955:1578_AGCGTCTTTCATGCTG    0    9    41603892    1    50M
K00295:342:HNYVTBBXY:5:1101:1976:1578_TCATACCAAGTCTCCG    16    9    113429747    42    49M
K00295:342:HNYVTBBXY:5:1101:1996:1578_TCATCGAACCTCGTTG    16    20    21594558    42    51M
K00295:342:HNYVTBBXY:5:1101:2016:1578_TGGATCAACAGGACCA    0    16    13244975    27    51M
K00295:342:HNYVTBBXY:5:1101:2057:1578_GATGCGTTTTCTGGTT    0    14    68520409    42    50M
K00295:342:HNYVTBBXY:5:1101:2098:1578_CGTCGCCAAACTTAAC    0    8    94503004    42    50M

预期输出为CGTCGCCAAACTTAAC_HP100.txt文件,该文件包含带有_CGTCGCCAAACTTAAC标记的所有行。

您只需使用以下awk命令:

awk -F '[t_]' '{print $0 >> ($2 "_HP100.txt")}' file

使用您显示的示例和尝试,请尝试以下awk代码。它是awk+sort+cut+awk解决方案的组合,如果您有多行第二个字段相同,并且您想将所有相同的$2行保存在同一输出文件中,这将对我们有所帮助。这是从$2开始对它们进行排序(将第二个字段作为第一个字段进行排序,然后只使用输入的必需/实际部分(。

awk -F'_|t' '{print $2,$0}' Input_file  | sort | cut -d' ' -f2- | 
awk -F'_|t' '
prev!=$2{
close(outputFile)
outputFile=$2"_HP100.txt"
}
{
print $0 > (outputFile)
prev=$2
}
'

注意:将您的Input_file传递给上面代码中第一个使用的awk。此外,此代码适用于小文件。

我想到的处理50GB问题的方法是每轮收集一定数量,然后当输入数组达到固定阈值时,根据其文件名输出行

当前的方法不是不停地插入一个非常长的字符串,而是使用一个数组来表示行本身,并使用另一个数组将文件名映射到row #s (aka NR):

  1. 收集直到达到阈值(我没有设置一个达到u的值(
  2. 将数组中的所有数据转储到文件--还允许重新创建原始输入行顺序
    • 使用print (. . .) >> (fn)而不是>,以防万一
  3. 使用split("", arr)将两个阵列重置为mint状态--它比delete arr语句更干净、更便携
  4. 主机系统资源友好
    • 只需要一个awk实例,从而最大限度地减少主机系统上的并发资源使用
    • 您设置的阈值也会在任何时候将RAM的使用限制在一个合理的水平
    • 避免了使用shell循环、xargsgnu-parallel
    • 避免不间断close(fn)
  5. 避免浪费时间执行任何数量的数据sort
mawk '1;1;1;1;1;1;1' raw_input.txt | shuf | 
mawk2 '
BEGIN {  OFS = "_HP100.txt"
FS  = "^[^_]+_|[ t].+$" 
}  { ___[ NR ] = $_
sub(OFS, _, $!(NF = NF))
sub( "$", "=" NR,____[$_]) 
} END { 
OFS = "frtt"
for(_ in  ___) { print _, ___[_] } 
for(_ in ____) { print _,____[_] } } '      

最新更新