我有一個包含數千條記錄的檔案,這些記錄根據它們共同的身份號碼的前 6 位分組為子組,但有些記錄是重復的。我正在嘗試創建一個 bash 腳本來讀取檔案,查找重復記錄和它們共享的身份編號,并列印出它們下的身份編號和重復記錄。
當前腳本:
#!/bin/bash
########## script to find duplicate records & their ID
INPUT="sourceFile.txt"
while read varName; do
echo "$varName"
if [ "$varName" = "NEXT" ]; then
sort $INPUT | uniq -d
echo "END OF ONE ID-NUMBER IN FILE"
fi
done < "$INPUT"
示例 INPUT_FILE:
NEXT
123456-
# requesting: displayName
displayName: Alpha Beta
displayName: Charly Delta Echo
displayName: Xerox Yingyang Zenox
displayName: Xerox Yingyang Zenox
NEXT
123999-
# requesting: displayName
displayName: Golf Harvey Indigo
displayName: Jaguar Kingston Lambda
displayName: Alma Nano Matter
displayName: Oxygen Pascal Queen
displayName: Romeo Saint Tropez Unicorn
displayName: Vauxhall Wellignton Woolwhich
displayName: Rodrigo Compton Hilside
displayName: Vauxhall Wellignton Woolwhich
NEXT
期望輸出/預期輸出:
NEXT
123456-
displayName: Xerox Yingyang Zenox
displayName: Xerox Yingyang Zenox
END OF ONE ID-NUMBER IN FILE
NEXT
123999-
displayName: Vauxhall Wellignton Woolwhich
displayName: Vauxhall Wellignton Woolwhich
感謝您提供預期的想法和線索。
uj5u.com熱心網友回復:
我不知道為什么你想要重復的行兩次,我不明白“檔案中的 END OF ONE ID-NUMBER”在輸出中間做什么。
以下僅顯示重復項。
#! /bin/bash
read -r next; unset next
while true; do
read -r id || break
read -r comment; unset comment
dns=()
while read -r dn; do
if [[ $dn =~ ^NEXT$ ]]; then
printf 'NEXT\n'
printf '%s\n' "$id"
printf '%s\n' "${dns[@]}" | sort | uniq -d
break
else
dns =("$dn")
fi
done
done
如果你真的想硬編碼輸入檔案的名稱,你可以在開頭添加以下行:
exec < sourceFile.txt
uj5u.com熱心網友回復:
sort顯然對整個檔案進行排序。我會將其重構為一個簡單的 awk 腳本。
awk '/^NEXT/ { delete a;
if(NR>1) { print ""; print "END OF ONE ID-NUMBER IN FILE"; print ""; }
id=""; print; next }
id == "" { id = $0; print; next }
!/^displayName:/ { next }
$0 in a { print; if (a[$0] == 1) print; }
{ a[$0] }' sourceFile.txt
一旦您熟悉了 Awk 的基礎知識,這應該相當簡單。但簡而言之,我們保留一個關聯陣列a,在其中記住displayName:我們已經看過哪些行,并且當我們看到重復的行時,我們將列印(如果尚未列印則為原件,以及)最新出現的行。
其中一些有點難看,因為您的要求相當不吸引人;也許更好的設計是在同一行上僅列印帶有關聯 ID 號的實際重復項。
awk '/^NEXT/ { delete a; id=""; next }
id == "" { id = $0; next }
!/^displayName:/ { next }
$0 in a { if(a[$0] == 1) print id ":" $0 }
{ a[$0] }' sourceFile.txt
某些東西被復制的事實已經足夠了,所以我們只列印記錄中任何東西的第二次出現。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339869.html
下一篇:k最小未排序陣列的時空復雜度
