簡體   English   中英

awk,根據不同文件的行匹配方式打印某些列

[英]Awk, printing certain columns based on how rows of different files match

我很確定這是 awk 我必須使用我有一個包含我需要的信息的文件和另一個文件,我需要從中獲取兩條信息並根據該條信息從第二個文件中獲取兩個數字。 因此,如果第一個文件的第五列有 m7,第三列有 3,我想在第二列中搜索第一列有 3 且第四列有 m7 的行。 我想從這些文件中打印某些列,如下所列。

鑒於輸入file1的以下兩個文件

1 dog   3   8   m7  n15 
50 cat  5   8   m15 m22
20 fish 6   3   n12 m7  

文件 2

3   695 842 m7  word
5   847 881 m15 not
8    910 920 n15 important
8   695 842 m22 word
6   312 430 n12 not

我想產生輸出

pre3   695   842   21
pre5   847   881   50
pre6   312   430   20
pre8   910   920   1
pre8   695   842   50

編輯:

我還需要生成表單的輸出

pre3   695   842   pre8   910   920   1
pre5   847   881   pre8   695   842   50
pre6   312   430   pre3   695   842   20

下面的答案適用於之前的問題,但我對它的一些語法感到困惑,所以我不確定如何調整它以生成此輸出

這個命令:

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1] {print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2

對於第一個文件的第五和第三(或第六和第四)列的內容與第二個文件的第四列的內容相同的所有行,輸出pre加上第二個文件的第一、第二和第三列的內容以及第一個文件的第一列和第一列:

pre3 695 842 21
pre5 847 881 50
pre8 910 920 1
pre8 695 842 50
pre6 312 430 20

(對於具有多個匹配項的行,總結了 ar[$4,$1] 的值)

請注意,輸出不一定要排序! 要實現這一點:添加sort

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1]{print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 | sort

代碼是做什么的?

  • NR==FNR{...}適用於第一個輸入文件
  • NR>FNR{...}適用於第 2、3、... 輸入文件
  • ar[$5,$3]創建一個數組,其鍵是當前行/記錄的第 5 和第 3 列的內容(由字段分隔符分隔;通常是單個空格)

您可以使用以下命令:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4]' f1.txt f2.txt

如果您只想打印第二個文件中匹配行中的特定字段,請使用如下所示:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4] { print "pre"$1" "$2" "$3}' f1.txt f2.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM