【问题标题】:How to print all rows from column1 and only certain rows from other columns如何打印 column1 中的所有行以及其他列中的某些行
【发布时间】:2023-03-08 12:46:01
【问题描述】:

我有一个包含 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

【问题讨论】:

  • 你尝试了什么?发布您自己的尝试
  • 它们总是连续的吗?
  • 你应该看看是什么让一个问题成为minimal reproducible example
  • 发布问题时,不要提供多个替代输出,尤其是当 1 比另一个“更好”时。这是一个软件,所以一切皆有可能 - 只需发布简洁、可测试的样本输入(就像您所做的那样)和 THE 您想要获得该输入的所需输出。对我们来说保持简单 - 我们阅读和尝试理解的内容越少来帮助您,您就会有越多的人愿意帮助。
  • 感谢您的反馈。我会记住这一点。再次感谢您的帮助

标签: linux bash unix awk sed


【解决方案1】:
$ 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

【讨论】:

  • 谢谢埃德!这正是我需要的!
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2018-10-21
  • 2016-10-22
  • 2017-02-26
  • 1970-01-01
  • 2011-09-26
  • 2021-11-08
  • 2022-01-01
相关资源
最近更新 更多