我有一个文本文件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相同。 谢谢, 拉维
答案 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 '{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
来提取所需的列,然后执行sort
和uniq
内容:
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}'