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

标签 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”上写入第二个字段 目前我正在做以下事情:

排序-k 2,2 测试.txt| uniq -i -f 1 | cut -d ' ' -f2 > 结果.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

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

输入第三个字段

    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

输出

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

您的文件可以有任意数量的列,但此命令只会查看第 2 列。

关于linux - 用于在具有索引的文件中查找唯一值的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6207840/

相关文章:

linux - 监听端口上的选择性多播组

python - 探戈与 Django ModuleNotFoundError : No module named 'registration'

linux - 二维几何绘图工具

php - 创建另一个符号链接(symbolic link)顶部的符号链接(symbolic link)

linux - tar 命令不生成 .tar.gz 文件

linux - 期望自动登录到二级远程机器

xcode - 如何停止从 shell 脚本构建 Xcode

linux - 以编程方式触发 linux 上的 inotify 事件

bash - cURL 获得的页面源与 Chrome 浏览器不同

找不到 MySQL 命令 [MAMP]