对字段中的每个值执行一系列命令

对字段中的每个值执行一系列命令

我有一个 tsv 文件。对于第 5 列中的特定值,我想提取所有行,然后剪切三列,然后计算唯一行。例如,对于第 5 列中的字符串“abc”,我想要

awk '$5 == "abc"' file.tsv | cut -f 1-3 | sort -u | wc -l

但我想对第 5 列中的所有唯一字符串执行此操作,而不仅仅是“abc”。应该有类似“for i in $5”的内容,但我并没有完全理解这个“for循环”的东西。我无法给出单独的命令,因为有太多的字符串。

在此输入图像描述

答案1

这将打印预期的结果

cut -f 1-3,5 file.tsv | sort -u | cut -f 4 | sort | uniq -c | awk '{ print $2, $1; }'

解释:

cut -f 1-3,5 file.tsv提取相关列 1、2、3、5
sort -u获取唯一组合
cut -f 4仅提取原始第 5 列值,该值现在位于第 4 列中 对
sort | uniq -c唯一值进行排序和计数
awk '{ print $2 "\t" $1; }'交换列并格式化输出

答案2

看起来你想要类似的东西

awk '{test[$5" "$1" "$2" "$3]++}END{for (t in test) print t}' file1 | cut -d' ' -f1 | sort | uniq -c

走过

test[$5" "$1" "$2" "$3]++ #populates an array with unique combinations of these fields
for (t in test) print t   #print each unique array index (field combination) once to STDOUT
cut -d' ' -f1             #extract what was the original 5th field
sort                      #yes, yes OK @Bodo
uniq -c                   #count the number of times it appears

输出

2 abc
1 def

编辑

虽然承认败在@Bodo手中,但寻找可行awk解决方案的决心仍然存在,所以我提供了这个丑陋的野兽......

awk '!test[$5" "$1" "$2" "$3]{out[$5]++;test[$5" "$1" "$2" "$3]++}
  END
  {for (o in out) print o, out[o]}' file1

相关内容