我们说我有一个这样的文件有2列
56-cde
67-cde
56-cao
67-cgh
78-xyz
456-hhh
456-jjjj
45678-nnmn
45677-abdc
45678-aief
我想获得这样的输出:
56-cde
56-cao
67-cde
67-cgh
456-hhh
456-jjjj
45678-aief
45678-nnmn
所以基本上不是打印出打印重复项所需的唯一值:
我试图用这样的awk来完成这个:
cat input.txt | awk -F"-" '{print $1,$2}' | sort -n | uniq -w 2 -D
毫无疑问,这表明我已经复制了第1列中的哪些值,并且还显示了第1列的重复值以及相应的第2列值。但由于我将字节数硬编码为2,因此它仅显示第一列中2位数字的重复值。有没有办法用awk做到这一点?
提前致谢。
答案 0 :(得分:1)
查看您的uniq是否有-D
选项。我的cygwin版本确实:
cat input.txt | sort | uniq -w 2 -D
答案 1 :(得分:1)
另一个没有数组的awk解决方案(但使用预分配)
sort -n file | awk -F- '
NR==1{p=$1; a=$0; c++; next}
p==$1{a=a RS $0; c++; next}
c{print a}
{a=$0; p=$1; c=0}
END{if(c) print a}'
答案 2 :(得分:0)
这就是我提出的(只是一个awk程序,没有外部排序,uniq等):
BEGIN { FS = "-" }
{ arr[$1] = arr[$1] "-" $2 }
END {
for (i in arr) {
if ((n = split(arr[i], a)) < 3) continue
for (j = 2; j <= n; ++j)
print i"-"a[j]
}
}
它会收集所有数字以及附加的不同字符串
在arr
中(假设字符串不会包含短划线-
)。
使用gawk,你可以使用数组数组,以避免连接和破折号分裂。
答案 3 :(得分:0)
我会通过预处理数据来处理变数位数的情况,这样数字字段 是一个固定的大宽度(并在uniq中使用该宽度):
cat input.txt | awk -F- '{printf "%12d-%s\n",$1,$2}'| sort | uniq -w 12 -D
如果您还需要输出左对齐,只需处理此后处理步骤:
| awk '{print $1}'
答案 4 :(得分:0)
使用Perl
$ cat two_cols.txt
56-cde
67-cde
56-cao
67-cgh
78-xyz
456-hhh
456-jjjj
45678-nnmn
45677-abdc
45678-aief
$ perl -F"-" -lane ' @t=@{$kv{$F[0]}}; push(@t,$_); $kv{$F[0]}=[@t]; END { while(($x,$y)=each(%kv)){ print join("\n",@{$y}) if scalar @{$y}>1 }} ' two_cols.txt
67-cde
67-cgh
56-cde
56-cao
456-hhh
456-jjjj
45678-nnmn
45678-aief
$