Linux按特定列的总和过滤文本行

时间:2018-04-09 10:11:31

标签: linux bash shell awk sequence

从原始测序数据中,我创建了一个计数文件(.txt),其中包含每个样本的唯一序列计数。 数据如下所示:

sequence    seqLength S1   S2   S3   S4   S5   S6   S7   S8
AAAAA...    46        0    1    1    8    1    0    1    5
AAAAA...    46        50   1    5    0    2    0    4    0
...
TTTTT...    71        0    0    5    7    5    47   2    2
TTTTT...    81        5    4    1    0    7    0    1    1

我想过滤每行和的序列,因此只删除所有样本总和(S1到S8的总和)低于例如100的行。

这可以用awk完成,但我没有使用这个文本处理实用程序的经验。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

尝试一下:

awk 'NR>1 {sum=0; for (i=3; i<=NF; i++) { sum+= $i } if (sum > 100) print}' file.txt

它会跳过第1行NR>1 然后将在示例中从第3项(S1到S8)开始每行汇总项目:

{sum=0; for (i=3; i<=NF; i++) { sum+= $i } 

然后只会打印sum为&gt;的行。超过100:if (sum > 100) print}'

您可以根据总和修改/测试条件,但希望这可以让您了解如何使用awk

答案 1 :(得分:1)

关注awk可能对您有帮助。

awk 'FNR>1{for(i=3;i<=NF;i++){sum+=$i};if(sum>100){print sum > "out_file"};sum=""}'   Input_file

如果您需要不同的不同文件,那么以下内容可能有所帮助。

awk 'FNR>1{for(i=3;i<=NF;i++){sum+=$i};if(sum>100){print sum > "out_file"++i};sum=""}'  Input_file