您实际上在这里遇到了两个问题,这两个问题都可以使用awk
.
首先,您需要先将文件拆分为更小的文件:
awk 'NR==1 { r=$0; next } { print ($1==i ? "" : r ORS) $0 > "file_category_" $1 ".txt"; i=$1 }' input.txt
其次,您需要根据您的选择标准过滤较小的文件:
for i in file_category_*.txt; do awk 'FNR==NR { a[$3]++; next } FNR==1 || a[$3]>1 && $2 !~ /^rs/' "$i"{,} > tmp && mv tmp "$i"; done
这是结果grep . file_category_*.txt
:
file_category_1.txt:A B C
file_category_1.txt:1 kp1 5
file_category_1.txt:1 ga2 6
file_category_2.txt:A B C
file_category_2.txt:2 kp3 7
file_category_3.txt:A B C
或者,如果您有GNU awk
并且需要单通道解决方案,您可以使用多维数组来做同样的事情。像这样运行:
awk -f script.awk input.txt
内容script.awk
:
NR==1 {
r=$0
next
}
{
a[$1][$3][$0]
next
}
END {
for (i in a) {
for (j in a[i]) {
for (k in a[i][j]) {
split(k,b)
print (n==1 ? "" : r ORS) \
(length(a[i][j])>1 ? \
(b[2] !~ /^rs/ ? k : "") : "") \
> "file_category_" i ".txt"
n=1
}
}
n=0
}
}
这是结果grep . file_category_*.txt
:
file_category_1.txt:A B C
file_category_1.txt:1 kp1 5
file_category_1.txt:1 ga2 6
file_category_2.txt:A B C
file_category_2.txt:2 kp3 7
file_category_3.txt:A B C
或者,这是单线:
awk 'NR==1 { r=$0; next } { a[$1][$3][$0]; next } END { for (i in a) { for (j in a[i]) for (k in a[i][j]) { split(k,b); print (n==1 ? "" : r ORS) (length(a[i][j])>1 ? (b[2] !~ /^rs/ ? k : "") : "") > "file_category_" i ".txt"; n=1 } n=0 } }' input.txt