bash脚本用于在具有索引的文件中查找唯一值

时间:2011-06-01 21:18:30

标签: linux 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

我想基于第二个字段进行排序,并且只想在“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

如果说还有第3个领域还有一件事。如何实现上述仅仅意味着在排序和查找唯一性时仅使用第二个字段。

输入第3个字段

    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相同。 谢谢, 拉维

4 个答案:

答案 0 :(得分:2)

尝试使用此命令打印包含所有原始索引的列:

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

输出

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

更新:使用awk only解决方案

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

您的文件可以包含任意数量的列,但此命令仅查看第2列。

答案 1 :(得分:1)

我认为您希望使用cut来提取所需的列,然后执行sortuniq内容:

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

这假设列由单个空格分隔。

请注意,您需要-f启用sort,以便排序不区分大小写,否则仅在大小写不同的行不会彼此相邻且uniq -i可能不会做你想做的事。

答案 2 :(得分:1)

你真是太近了!要根据您目前所做的事情获取第二列的值,您应该使用awk。它用于逐行处理流并仅提取所需的部分。

您的代码: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

Awk将按空格分割您的输入,print $2将采用第二个文本块。我建议调查awk - 这对很多问题都很好。

答案 3 :(得分:1)

好玩 - 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}'