[英]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可以處理它; 如果沒有,請讓我知道我該怎么做。
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
正如我在評論中指出的那樣,需要提供大量未說明的信息才能給出明確的答案。 但是,我們可以做出一些看似合理的猜測:
選擇的工具可能是sed
和join
:
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.txt
和file1.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)
。
我認為評論可能會要求輸入,例如:
919167,hutch,mumbai
919594,idea,mumbai
902130,airtel,karnataka
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.