【问题标题】:Awk item from column one, then awk again using the result in column two?awk 第一列中的项目,然后再次使用第二列中的结果 awk?
【发布时间】:2014-12-17 21:58:23
【问题描述】:

我有一个 CSV,我需要使用该 CSV 第一列中的键对其进行排序,然后我需要再次 awk 并通过第 2 列搜索并返回所有匹配的数据。

所以:我会用第一个键awk,它只会返回第二列的结果[所以只是单元格]。然后我会使用单元格内容 awk 并让它返回所有匹配的行。

我几乎没有bash/awk 脚本编写经验,所以请多多包涵。 :)

输入:

KEY1,TRACKINGKEY1,TRACKINGNUMBER1-1,PACKAGENUM1-1
    ,TRACKINGKEY1,TRACKINGNUMBER1-2,PACKAGENUM1-2
    ,TRACKINGKEY1,TRACKINGNUMBER1-3,PACKAGENUM1-3
    ,TRACKINGKEY1,TRACKINGNUMBER1-4,PACKAGENUM1-4
    ,TRACKINGKEY1,TRACKINGNUMBER1-5,PACKAGENUM1-5
KEY2,TRACKINGKEY2,TRACKINGNUMBER2-1,PACKAGENUM2-1
KEY3,TRACKINGKEY3,TRACKINGNUMBER3-1,PACKAGENUM3-1
    ,TRACKINGKEY3,TRACKINGNUMBER3-2,PACKAGENUM3-2

命令:

awk -v key=KEY1 -F' *,' '$1==key{f=1} $1 && $1!=key{f=0} f{print $3}' file

输出:

TRACKINGNUMBER1-1
TRACKINGNUMBER1-2
TRACKINGNUMBER1-3
TRACKINGNUMBER1-4
TRACKINGNUMBER1-5

这就是我尝试过的。我想awk,所以如果我搜索返回 trackingkey1 的 key1,然后 awk 使用 trackingkey 一个并输出每个完整的匹配行。


对不起,我应该更清楚。例如 - 如果我搜索 KEY3,我会 like 输出为:

    KEY3,TRACKINGKEY3,TRACKINGNUMBER3-1,PACKAGENUM3-1
        ,TRACKINGKEY3,TRACKINGNUMBER3-2,PACKAGENUM3-2

所以我想要的是最初搜索 KEY3,它会返回 TRACKINGKEY3。然后我会搜索 TRACKINGKEY3,它会返回包含 TRACKINGKEY3 的每一行。

【问题讨论】:

  • 到目前为止您尝试了什么?并显示您想要接收的输入和输出
  • 您的代码似乎可以工作...有什么问题?

标签: linux bash shell csv awk


【解决方案1】:

这是你想要的吗?

awk -v key=KEY3 -F ',' '{if($1==key)tkey=$2;if($2==tkey)print}' file

它只对文件进行一次传递,而不是您描述的多次传递,但输出与您请求的内容相匹配。当它在第一列中找到指定的键时,从第二列中获取跟踪键。它打印与此跟踪键匹配的每一行。

实现相同目的的更短的方法是使用 awk 的隐式打印:

awk -v key=KEY3 -F ',' '$1==key{tkey=$2}$2==tkey' file

【讨论】:

  • 不,无论输入什么键,它都会输出整个文件
  • @KevinSouter:它不适合我。我对其进行了测试,并得到了所有三个键的正确输出。
  • 啊,我的 CSV 中有 "s,我会 tr -d "\"" 看看会发生什么。
  • 在调整引号后[以及我是个白痴的事实,在我的生产测试 csv 中,第二个键实际上在第四列] 它工作得很好!谢谢楼主!
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多