簡體   English   中英

在BASH中逐行比較兩個文件

[英]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

我假設| 不在您的文件中。

pasteawk

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.

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