bash脚本在带索引的文件中查找唯一值

我有一个文本文件,test.txt,就像

shekhar cbv ravi cbv ravi sdf asd df ravi Df ravi dfg ravi df ravi dfg ravi df afas cvb sdf hgh sasdg cfg 

我想基于第二个字段进行sorting,只想在“result.txt”上写第二个字段。目前我正在做以下工作:

sort -k 2,2 test.txt | uniq -i -f 1 | cut -d''-f2> result.txt

这是写2n字段即

 cbv cfg cvb df dfg hgh sdf 

对应于每个唯一的第二个字段值,我想要它的所有索引在原始文件中。 这怎么可能?

期望的输出:

 cbv 1 2 cfg 12 cvb 10 df 4 5 7 9 dfg 6 8 hgh 11 sdf 3 

如果说还有第三领域还有一件事。 如何实现上述仅意味着分类和查找唯一性只有第二领域被使用。

input与第三场

  shekhar cbv rg ravi cbv fdf ravi sdf dfh asd df dfhdfh ravi Df fgh ravi dfg dfh ravi df dfgh ravi dfg dfgh ravi df dfhg afas cvb fhfg sdf hgh cgfhfg sasdg cfg fgh 

所需的o / p相同。 谢谢,拉维

试试这个命令来打印所有原始索引的列:

 awk '{k=tolower($2); arr[k]=arr[k] " " NR} END{for(v in arr) print v, arr[v]}' test.txt | sort -f -k 1,1 

OUTPUT

 cbv 1 2 cfg 12 cvb 10 df 4 5 7 9 dfg 6 8 hgh 11 sdf 3 

更新:使用awk唯一的解决方案

 awk '{k=tolower($2); arr[k]=arr[k] " " NR} END{n=asorti(arr, dest); for(i = 1; i <= n; i++) print dest[i], arr[dest[i]]}' test.txt 

你的文件可以有任意数量的列,但这个命令只能看第二列。

我想你想使用cut来提取你想要的列,然后做sortuniq东西:

 cut -f2 -d' ' test.txt | sort -f | uniq -i > result.txt 

这假定列被一个空格分开。

请注意,您将需要-f开关sort以便排序将不区分大小写,否则仅在大小写不同的行将不会彼此旁边和uniq -i可能不会做你想做的事情。

你太亲近了! 为了得到第二列的值,你应该使用awk 。 它用于逐行处理流,并提取所需的部分。

你的代码: sort -k 2,2 test.txt| uniq -i -f 1 | cut -d ' ' -f2 > result.txt sort -k 2,2 test.txt| uniq -i -f 1 | cut -d ' ' -f2 > result.txt

用awk: sort -k 2,2 test.txt| uniq -i -f 1 | cut -d ' ' -f2 | awk '{print $2}' > result.txt sort -k 2,2 test.txt| uniq -i -f 1 | cut -d ' ' -f2 | awk '{print $2}' > result.txt

Awk会用空格分隔输入, print $2会得到第二个文本块。 我建议看看awk – 这对很多问题都很好。

为了好玩 – perl:

 perl -anle 'push(@{$s{$F[1]}},++$n);END{map{print "$_: @{$s{$_}}"} sort keys %s}' 

或不区分大小写

 perl -anle 'push(@{$s{lc($F[1])}},++$n);END{map{print "$_: @{$s{$_}}"} sort keys %s}'