使用您的脚本作为基础:
awk 'FILENAME=="duplicates.txt" {arr[$0]++}
FILENAME=="ids.txt" { if (arr[$0]) printf "%s%d\n", $0, ++cnt[$0];
else print
}' \
duplicates.txt ids.txt
您在重复到达时对它们进行计数/记录,以便知道哪些行是重复的。重复文件是否列出重复名称一次或多次并不重要;两者都会好的。
第二个循环记录当前行是否在重复列表中;如果是这样,它会打印该行后跟一个预先递增的计数器(因此给定副本的第一次出现以 1 作为后缀);否则,该行将按原样打印。
FILENAME = "filename"
您可以辩论vs的优点FNR == NR
来区分这两个文件;最终结果是相同的,因此您也可以尝试:
awk 'FNR == NR { arr[$0]++; next }
{ if (arr[$0]) printf "%s%d\n", $0, ++cnt[$0];
else print }' duplicates.txt ids.txt
请注意,print
如果您希望在和dabbot1
之间没有空格,则使用不可行。如果空格无关紧要并且您总是想要一个后缀(如果没有重复则为 0),您可以只写而不是with 。dabbot
1
printf $0, ++cnt[$0]
if
printf
如果你使用这个FNR == NR
技巧,你甚至不需要预先准备重复文件;你可以简单地使用:
awk 'FNR == NR { arr[$0]++; next }
{ if (arr[$0] > 1) printf "%s%d\n", $0, ++cnt[$0];
else print }' ids.txt ids.txt
第一次通过文件,它通过计数来整理出哪些记录是重复的。第二次通过文件,它知道哪些是重复的(计数arr
超过1
)并且可以在这些行上打印后缀。