我有一个包含许多列和行的大文件,如下所示:
A B C D E F1 F2 F3 F4 F5
a1 b1 c1 d1 e1 0 0 1 0 1
a2 b2 c2 d2 e2 1 0 0 1 1
a3 b3 c3 d3 e3 1 1 0 0 1
....
A、B、C、D、E列包含一些信息,F1-5列代表一些id。 0 或 1 表示该 id 的 AE 信息不存在/存在。
我想为每个id创建文件,而每个文件都包含该id具有的ABCDE信息。例如,F5 前 3 行有 3 个 1,所以
F5.txt:
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3
F1 的前 3 行有两个 1,所以
F1.txt:
A B C D E
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3
如何使用 awk 过滤此文件并使用 id 名称(F1、F2...)创建新文件?
答案1
AWK
解决方案:
awk 'NR==1{ split($0,h); columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5]); next }
{ for (i=6;i<=NF;i++)
if ($i) {
if (!a[h[i]]++) print columns > h[i]".txt";
print $1,$2,$3,$4,$5 > h[i]".txt"
}
}' file
split($0,h)
- 将第1条记录拆分为数组h
以获得标头列名columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5])
- 构造公共列字符串A B C D E
if($i)
- 如果当前字段(从第 6 个字段开始)不是空的,即不是""
(空字符串)或0
- 准备进一步处理h[i]
- 指向当前文件名,即F1
等(或如您所写:代表一些id)if (!a[h[i]]++) print columns > h[i]".txt"
- 如果名称下的文件h[i]
是第一次写入 - 打印标题/列行(作为第一行)
查看结果:
$ head F*.txt
==> F1.txt <==
A B C D E
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3
==> F2.txt <==
A B C D E
a3 b3 c3 d3 e3
==> F3.txt <==
A B C D E
a1 b1 c1 d1 e1
==> F4.txt <==
A B C D E
a2 b2 c2 d2 e2
==> F5.txt <==
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3