过滤具有特定标题名称且列中包含“1”的行

过滤具有特定标题名称且列中包含“1”的行

我有一个包含许多列和行的大文件,如下所示:

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

相关内容