我有一個包含三列的檔案。我想為第 2 列中的每個唯一值提取第 3 列中具有前兩個值的行。
cat file.list
run1/xx2/x2c1.txt 21 -190
run1/xx2/x2c2.txt 19 -180
run1/xx2/x2c3.txt 18 -179
run1/xx2/x2c4.txt 19 -162
run1/xx2/x2c5.txt 21 -172
run2/xx2/x2c1.txt 21 -162
run2/xx2/x2c2.txt 18 -192
run2/xx2/x2c3.txt 19 -191
run2/xx2/x2c4.txt 19 -184
run2/xx2/x2c5.txt 21 -179
run3/xx2/x2c1.txt 19 -162
run3/xx2/x2c2.txt 19 -192
run3/xx2/x2c3.txt 21 -191
run3/xx2/x2c4.txt 18 -184
run3/xx2/x2c5.txt 19 -179
預期產出
run2/xx2/x2c2.txt 18 -192
run3/xx2/x2c4.txt 18 -184
run3/xx2/x2c2.txt 19 -192
run2/xx2/x2c3.txt 19 -191
run3/xx2/x2c3.txt 21 -191
run1/xx2/x2c1.txt 21 -190
我覺得 sort、uniq 和 awk 的某種組合可能會完成,但我無法正確執行它。我可以按列排序
sort -nk2 -nk3 file.list
這給了我一個按 -k2 和 -k3 排序的輸出,如下所示,
run2/xx2/x2c2.txt 18 -192
run3/xx2/x2c4.txt 18 -184
run1/xx2/x2c3.txt 18 -179
run3/xx2/x2c2.txt 19 -192
run2/xx2/x2c3.txt 19 -191
run2/xx2/x2c4.txt 19 -184
run1/xx2/x2c2.txt 19 -180
run3/xx2/x2c5.txt 19 -179
run1/xx2/x2c4.txt 19 -162
run3/xx2/x2c1.txt 19 -162
run3/xx2/x2c3.txt 21 -191
run1/xx2/x2c1.txt 21 -190
run2/xx2/x2c5.txt 21 -179
run1/xx2/x2c5.txt 21 -172
run2/xx2/x2c1.txt 21 -162
但后來我陷入了如何只提取最后一列中兩個分數最好的行,分別為 18、19 和 20。
我真的很感激任何 bash 解決方案。
uj5u.com熱心網友回復:
將當前sort結果傳送到awk:
$ sort -nk2 -nk3 file.list | awk 'a[$2] < 2'
run2/xx2/x2c2.txt 18 -192
run3/xx2/x2c4.txt 18 -184
run3/xx2/x2c2.txt 19 -192
run2/xx2/x2c3.txt 19 -191
run3/xx2/x2c3.txt 21 -191
run1/xx2/x2c1.txt 21 -190
在哪里:
- 欄位 #2 (
$2) 用作陣列的索引a[] - 如果存盤在陣列中的值小于 2,則列印當前輸入行
- 然后遞增計數器 (
) - 第一次看到
a[18]計數為 0,我們列印該行,并將計數加 1 - 第二次我們看到
a[18]計數為 1,我們列印該行,并將計數增加 1 - 第 3 次(到第 n 次)我們看到
a[18]計數大于或等于 2,我們不列印該行,并增加計數
我們首先增加計數的另一種方法:
$ sort -nk2 -nk3 file.list | awk ' a[$2] <= 2'
run2/xx2/x2c2.txt 18 -192
run3/xx2/x2c4.txt 18 -184
run3/xx2/x2c2.txt 19 -192
run2/xx2/x2c3.txt 19 -191
run3/xx2/x2c3.txt 21 -191
run1/xx2/x2c1.txt 21 -190
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/471923.html
