linux - 如何打印 column1 中的所有行以及其他列中的某些行

标签 linux bash unix awk sed

我有一个包含 3 列和数千行的文件。下面是一个例子。

File.txt
Column1 column2 column3
173     banana   red
896     banana   red
567     apple    green
742     apple    green
893     apple    green
567     avocado  black
345     avocado  black

我需要打印 column1 中的所有行,但只打印 column2 和 column3 中的唯一名称。

I want this output:
Column1 column2 column3
173     banana   red
896              
567     apple    green
742     
893     
567     avocado  black
345     

如果我能得到下面的格式就更好了:

Banana-red: 173 896              
Apple-green: 567 742 893  
Avocado-black: 567 345

最佳答案

$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1} END{for (k in a) print k ":" a[k]}' file
apple-green: 567 742 893
banana-red: 173 896
avocado-black: 567 345

行将按照 in 运算符的随机顺序输出,列将按照它们在每个键值的输入中出现的顺序排列。如果您真的希望每个键的首字母大写,就像您问题中的预期输出一样:

$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1} END{for (k in a) print toupper(substr(k,1,1)) substr(k,2) ":" a[k]}' file
Apple-green: 567 742 893
Banana-red: 173 896
Avocado-black: 567 345

并且如果您希望行按照它们在输入中出现的顺序输出:

$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1l; if (!seen[k]++) keys[++numKeys]=k} END{for (keyNr=1; keyNr<=numKeys; keyNr++) {k=keys[keyNr]; print toupper(substr(k,1,1)) substr(k,2) ":" a[k]} }' file
Banana-red: 173 896
Apple-green: 567 742 893
Avocado-black: 567 345

关于linux - 如何打印 column1 中的所有行以及其他列中的某些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42305456/

相关文章:

linux - 使用 awk 在 Linux 中分割日期

unix - 构建静态链接的 Haxe cpp 程序

c++ - Linux 中使用三元运算符从 const char * 到 char * 的无效转换

bash - 为什么docker run -t阻止bash进程退出和停止容器

linux - 有 Linux radio 标准吗?

bash - 删除前导和尾随空白目录

java - 从 Java 执行 Unix 命令

bash - 如何在 shell 脚本中抑制命令的输出?

linux - 如何在切片的 "screen"终端中上下滚动

linux - git log 包含日期范围或之前/之后