从第一列获取awk项,然后再使用第二列中的结果再次使用awk?

时间:2014-12-17 21:58:23

标签: linux bash shell csv awk

我有一个CSV,我需要使用提供的密钥进行排序,该密钥位于所述CSV的第一列,然后我需要再次awk并通过第2列搜索并返回所有匹配的数据

所以:我用第一个键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,所以如果我搜索key1返回了trackingkey1,那么awk会跟踪一个并输出每个完整匹配的行。


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

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

所以我想要的是我最初搜索KEY3,它会返回TRACKINGKEY3。然后我会搜索TRACKINGKEY3并返回每个完整的行,其中包含所述TRACKINGKEY3。

1 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

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