簡體   English   中英

使用awk和打印比較兩個文件包含與其他文件匹配的文件

[英]Comparing two files using awk and printing contains which are matching from other files

我有兩個文件:

FILE1.TXT

919167,hutch,mumbai
919594,idea,mumbai

FILE2.TXT

919167000000
919594000000 

產量

919167000000,hutch,mumbai
919594000000,idea,mumbai

如何使用AWK實現這一目標? 我有一個龐大的電話號碼文件需要像這樣比較。 我相信Awk可以處理它; 如果沒有,請讓我知道我該怎么做。


額外的定義

  • 公共部分總是一個6位數字嗎? 是的總是6。
  • 這兩個文件已經排序了嗎? file1未排序。 file2可以排序。
  • 文件2中的尾隨數字是否始終為零? 不,這些是可以變化的電話號碼,目的是獲取電話號碼的系列信息。
  • 文件1是否包含給定數字的三個記錄,而文件2包含2個記錄,還是一對一? 這是一對一的。 文件1中是否有記錄,文件2中沒有匹配,反之亦然?_是。
  • 如果是這樣,你想看到無與倫比的記錄嗎? 是的,我想要兩個記錄。

擴展數據

FILE1.TXT

919167,hutch,mumbai
919594,idea,mumbai
918888,airtel,karnataka

FILE2.TXT

919167838888
919594998484
919212334323

產量預期:

919167838888,hutch,mumbai
919594998484,idea,mumbai
919212334323,nomatch,nomatch

正如我在評論中指出的那樣,需要提供大量未說明的信息才能給出明確的答案。 但是,我們可以做出一些看似合理的猜測:

  1. 公共數字是文件2的前6位數字(我們不關心尾隨數字,但只是將它們復制到輸出中)。
  2. 文件按順序排序。
  3. 如果任一文件中存在不匹配的記錄,則將忽略這些記錄。

選擇的工具可能是sedjoin

sed 's/^\([0-9]\{6\}\)/\1,\1/' file2.txt |
join -t, -o 1.2,2.2,2.3 - file1.txt

這會編輯file2.txt以創建一個逗號分隔的第一個字段,其中包含6位數的電話號碼,然后是該行的所有其余部分。 輸入被送到join命令,該命令連接在第一列上,並從file2.txtfile1.txt輸出第2行和第3列的“其余部分”(第2列)。

如果電話號碼是可變長度,則匹配操作非常復雜。 為此,我將進入Perl(或Python)來完成工作。 如果數據未排序,則可以在輸入命令之前對其進行排序。 如果需要不匹配的記錄,可以指定如何處理要join的選項中的記錄。


現在可以獲得所需的額外信息。 關鍵信息是固定的6位數 - p! 既然你在Linux上,我假設bash可用'進程替換':

sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -a 2 -e 'no-match' - <(sort file1.txt)

如果沒有進程替換,只需在原位對file1.txt進行排序:

sort -o file1.txt file1.txt

然后使用file1.txt代替<(sort file1.txt)


我認為評論可能會要求輸入,例如:

FILE1.TXT

919167,hutch,mumbai
919594,idea,mumbai
902130,airtel,karnataka

FILE2.TXT

919167000000
919594000000
919342313242

產量

no-match,airtel,karnataka
919167000000,hutch,mumbai
919342313242,no-match,no-match
919594000000,idea,mumbai

如果這不是評論的內容,請通過編輯問題來澄清,以便以比評論允許的更易讀的格式添加額外的數據和輸出。


使用擴展數據,這個溫和修改的命令:

sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -e 'no-match' - <(sort file1.txt)

產生輸出:

919167838888,hutch,mumbai
919212334323,no-match,no-match
919594998484,idea,mumbai

它看起來更像是所需輸出的排序版本。 -an選項控制是否打印文件1或文件2(或兩者)中不匹配的記錄; -e選項控制為不匹配的字段打印的值。 所有這一切很容易從該名男子頁join ,當然。

這是使用GNU awk的一種方式。 運行如下:

awk -f script.awk file2.txt file1.txt

script.awk內容:

BEGIN {
    FS=OFS=","
}

FNR==NR {
    sub(/[ \t]+$/, "")
    line = substr($0, 0, 6)
    array[line]=$0
    next
}

{
    printf ($1 in array) ? $0"\n" : "FILE1 no match --> "$0"\n"
    dup[$1]++
}

END {
    for (i in array) {
        if (!(i in dup)) {
            printf "FILE2 no match --> %s\n", array[i]
        }
    }
}

或者,這是單行:

awk 'BEGIN { FS=OFS="," } FNR==NR { sub(/[ \t]+$/, ""); line = substr($0, 0, 6); array[line]=$0; next } { printf ($1 in array) ? $0"\n" : "FILE1 no match --> "$0"\n"; dup[$1]++} END { for (i in array) if (!(i in dup)) printf "FILE2 no match --> %s\n", array[i] }' file2.txt file1.txt
awk -F, 'FNR==NR{a[$1]=$2","$3;next}{for(i in a){if($1~/i/) print $1","a[i]}}' your_file

暫無
暫無

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

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