我正试图根据文件所包含的模式来拆分文件,并使用该模式将它们存储为单独的文本文件。
我使用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)
:
- 收集直到达到阈值(我没有设置一个达到u的值(
- 将数组中的所有数据转储到文件--还允许重新创建原始输入行顺序
- 使用
print (. . .) >> (fn)
而不是>
,以防万一
- 使用
- 使用
split("", arr)
将两个阵列重置为mint状态--它比delete arr
语句更干净、更便携 - 主机系统资源友好
- 只需要一个
awk
实例,从而最大限度地减少主机系统上的并发资源使用 - 您设置的阈值也会在任何时候将RAM的使用限制在一个合理的水平
- 避免了使用shell循环、
xargs
或gnu-parallel
- 避免不间断
close(fn)
- 只需要一个
- 避免浪费时间执行任何数量的数据
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 _,____[_] } } '