我有一个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。
答案 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