Text-Processing
對欄位中的每個值執行一系列命令
我有一個 tsv 文件。對於第 5 列中的特定值,我想提取所有行,然後剪切三列,然後計算唯一行。例如對於第 5 列中的字元串“abc”,我想要
awk '$5 == "abc"' file.tsv | cut -f 1-3 | sort -u | wc -l
但我想對第 5 列中的所有唯一字元串執行此操作,而不僅僅是“abc”。應該有“for i in $5”之類的東西,但我並沒有完全得到這個“for循環”的東西。我不能給出單獨的命令,因為字元串太多了。
看起來你想要類似的東西
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
這將列印預期的結果
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
僅提取現在在第 4 列中的原始第 5 列值
sort | uniq -c
對唯一值
awk '{ print $2 "\t" $1; }'
交換列和格式輸出進行排序和計數