我的文件看起来像这样...
abc100200300 abmen
abc100200300 arcxi
xyz200300300 aelmi
如何将具有重复项的行(仅检查前 12 个字符)打印到单独的文件中?
所以在单独的文件中我应该有
abc100200300 abmen
abc100200300 arcxi
答案1
我不确定它是标准选项还是 GNU 扩展,但如果你uniq
有一个-w
标志:
-w, --check-chars=N
compare no more than N characters in lines
所以
sort file | uniq -D -w12
abc100200300 abmen
abc100200300 arcxi
或者,重定向到一个新文件
sort file | uniq -D -w12 > newfile
答案2
单程:
cut -c -12 file | uniq -d | grep -f - file
提取前 12 个字符,获取重复的字符,并获取与重复模式匹配的行。
答案3
GNU 的双遍方法awk
保留输入文件中的顺序:
gawk -v FIELDWIDTHS=12 '
ARGIND == 1 {c[$1]++; next}
FNR == 1 {for (i in c) if (c[i] < 2) delete c[i]}
$1 in c' inputFile inputFile
POSIX 等效项:
awk '
{key = substr($0, 1, 12)}
!first_pass_done {c[key]++; next}
FNR == 1 {for (i in c) if (c[i] < 2) delete c[i]}
key in c' inputFile first_pass_done=1 inputFile
答案4
我已经使用下面的 awk 和 sed 命令完成了
输入文件
abc100200300 abmen
abc100200300 arcxi
xyz200300300 aelmi
脚本
#!/bin/bash
for i in `awk '{print substr($1,1,12)}' Inputfile | sort | uniq`
do
j=`sed -n "/$i/p" Inputfile| wc -l`
if [[ $j > 1 ]]
then
sed -n "/$i/p" Inputfile>> /var/tmp/new_file_duplicate.txt
fi
done
New_file_duplicate.txt 包含以下内容
abc100200300 abmen
abc100200300 arcxi