簡體   English   中英

比較兩個文件並打印具有匹配列 awk 的行

[英]compare two file and print the lines that have matching columns awk

如果它們與第二個文件的第一列匹配,我需要使用 AWK 打印一個文檔的行。

第一個文件(comprobacio.txt):

2187405XJ4228N0001RX
42379999999997GH0002 
517878G4RSD407yJK4NY
4237405HHYT4323H0002
517P0P0P06GH9001233F
517878G4R67TRRHOPPNY
423123R66677789323H2

第二個文件(datos.txt):

2187405XJ4228N0001RX@1984@216@230 08m 06s N, 82o 21m 34s W 
4237405XJK4N37GH0002@2010@54@400 02m Ols N, 80o 20m 12s W 
517878G4RSO405XJK4NY@1954@103@400 42m 51s N, 74o 06m 21s E 
4237405HHYT4323H0002@2006@55@300 04m Ols N, 810 20m 12s W 
517POLIJ56GH9001233F@2010@803@400 52m 52s N, 74o 06m 70s E 
517878G4R67TRRHOPPNY@1954@108@400 42m 51s N, 74o 05m 21s E 
4237405899544T4323H2@2000@5778@390 12m 07s N, 900 10m 12s W 

OUTPUT 預計

2187405XJ4228N0001RX@1984@216@230 08m 06s N, 82o 21m 34s W 
4237405HHYT4323H0002@2006@55@300 04m Ols N, 810 20m 12s W
517878G4R67TRRHOPPNY@1954@108@400 42m 51s N, 74o 05m 21s E

我嘗試先用 sed 編輯第二個文件,以消除“@”字符並將其替換為空格“”。 並且 pipe 在它之后與 AWK 提出具有相同第一列但它沒有 output 任何東西的行。

sed 's/@/ /g' datos.txt | awk 'FNR==NR{array[$1];next} $1 in array {print $0}' datos.txt comprobacio.txt

知道我做錯了什么嗎?

在這種情況下,您可以對已排序的文件使用join

join -1 1 -2 1 -t @ <(sort file1) <(sort file2) 
2187405XJ4228N0001RX@1984@216@230 08m 06s N, 82o 21m 34s W 
4237405HHYT4323H0002@2006@55@300 04m Ols N, 810 20m 12s W 
517878G4R67TRRHOPPNY@1954@108@400 42m 51s N, 74o 05m 21s E 

試試這樣:

awk -F '@' 'NR==FNR{a[$0];next} $1 in a' comprobacio.txt datos.txt 
2187405XJ4228N0001RX@1984@216@230 08m 06s N, 82o 21m 34s W 
4237405HHYT4323H0002@2006@55@300 04m Ols N, 810 20m 12s W 
517878G4R67TRRHOPPNY@1954@108@400 42m 51s N, 74o 05m 21s E

我們使用-F '@'將 if 字段分隔符FS設置為@符號。

但是您的代碼中的問題是您替換的是同時從 STDIN 和文件中讀取。 要在 awk 中執行此操作,您需要將文件名設置為-以表示 STDIN,如下所示:

sed 's/@/ /g' datos.txt | awk 'FNR==NR{array[$1];next} $1 in array {print $0}' comprobacio.txt -
2187405XJ4228N0001RX 1984 216 230 08m 06s N, 82o 21m 34s W 
4237405HHYT4323H0002 2006 55 300 04m Ols N, 810 20m 12s W 
517878G4R67TRRHOPPNY 1954 108 400 42m 51s N, 74o 05m 21s E 

請注意尾隨的減號 ( - )。

另一種選擇是使用進程替換,例如:

awk 'FNR==NR{array[$1];next} $1 in array {print $0}' comprobacio.txt  <(sed 's/@/ /g' datos.txt)
2187405XJ4228N0001RX 1984 216 230 08m 06s N, 82o 21m 34s W 
4237405HHYT4323H0002 2006 55 300 04m Ols N, 810 20m 12s W 
517878G4R67TRRHOPPNY 1954 108 400 42m 51s N, 74o 05m 21s E 

請注意,在這種情況下,output 中的@符號被替換為空格。

像這樣使用 grep:

grep -Ff comprobacio.txt datos.txt

使用grep選項:

   -F, --fixed-strings
          Interpret PATTERNS as fixed strings, not regular expressions.

   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is used
          multiple  times  or  is  combined with the -e (--regexp) option,
          search for all patterns given.  The  empty  file  contains  zero
          patterns, and therefore matches nothing.

暫無
暫無

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

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