[英]Comparing two files in BASH line by line
我需要制作一個腳本文件,該文件可以讀取兩個文件並打印出它們之間的公共行。 我知道兩個文件的行數相同,並且每行僅包含一個單詞。
文件1:
Blue
Red
Orange
Green
Yellow
Blue
檔案2:
Blue
Green
Red
Purple
Yellow
Blue
預期產量:
Blue
Yellow
Blue
因此,在示例中,紅色和綠色出現在兩個文件中,但是在每個文件中它們不在同一行上,因此將其忽略。
嘗試使用awk,grep和comm,但無法使它們正常工作。
試圖找到需要最短時間處理的解決方案。
使用awk:
awk 'NR == FNR { lines[NR] = $0 } NR != FNR && lines[FNR] == $0 { print }' file1 file2
說明:
NR == FNR
)時,建立行號到值的映射 NR != FNR
)時,如果當前行與高速緩存中相應行的內容匹配,則打印該行 這將只讀取兩個文件一次,並且使用的內存與第一個文件的大小大致相同。
與粘貼和GNU grep。 一步步。
paste -d '|' file1 file2
輸出:
Blue|Blue Red|Green Orange|Red Green|Purple Yellow|Yellow Blue|Blue
paste -d '|' file1 file2 | grep -Po '^(.*)\|+\1$'
輸出:
Blue|Blue Yellow|Yellow Blue|Blue
使用\\K
:
paste -d '|' file1 file2 | grep -Po '^(.*)\|+\K\1$'
輸出:
Blue Yellow Blue
我假設|
不在您的文件中。
用paste
和awk
:
paste -d'|' file1 file2 | awk -F'|' '$1==$2 {print $1}'
我喜歡使用@Cyrus中的paste
,但是我認為合並行的比較更容易通過awk
理解。 在這種情況下, -F
會使用相同的分隔符|
這是非常簡單的,比較第一位$1
與第二$2
。 輸出可以是一個。
還假定|
不是輸入文件的一部分。 可以選擇其他任何字符。
如果輸入文件的每一行僅包含一個單詞,則它會更短並且也可以工作:
paste file1 file2 | awk '$1==$2 {print $1}'
還有一些方法
awk 'FNR==NR{a[FNR,$1];next}(FNR,$1) in a' file1 file2
檢測結果:
$ cat f1
Blue
Red
Orange
Green
Yellow
Blue
$ cat f2
Blue
Green
Red
Purple
Yellow
Blue
$ awk 'FNR==NR{a[FNR,$1];next}(FNR,$1) in a' f1 f2
Blue
Yellow
Blue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.