标题的措辞可能不是很好,但我目前需要编写一个在CSV中查找给定字符串的搜索脚本,然后解析找到的行并使用该行中的元素执行另一个grep。
示例:
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
我需要做的是grep .csv文件中的给定键[在本例中为key1],然后抓住TRACKINGKEY1以便我可以grep其余的行。我们的运输软件不会在每一行输出packingslip密钥,这就是为什么我必须首先通过KEY搜索然后通过TRACKINGKEY才能获得所有跟踪号码。
所以最初使用KEY1我最终想输出一个漂亮的小字符串,如“TRACKINGNUMBER1-1; TRACKINGNUMBER1-2; TRACKINGNUMBER1-3; TRACKINGNUMBER1-4; TRACKINGNUMBER1-5”
答案 0 :(得分: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
glennjackman帮助指出,通过为FS
使用“更智能”的值,内部逻辑可以更简单。
awk -v key=KEY1 -F' *,' '$1==key{f=1} $1 && $1!=key{f=0} f{print $3}' file
-v key=KEY1
将值KEY1
分配给awk变量key
-F' *,'
将值*,
(这是一个正则表达式)赋给awk FS
变量(控制字段拆分)
$1==key{f=1}
如果该行的第一个键等于key
变量(KEY1
)的值,则将值1
赋给变量{{1}找到我们想要的第一个关键线
f
如果第一个字段具有true-y值(在awk中为非零,非空字符串)并且第一个字段的值不等于{{1}的值}变量将值$1 && $1!=key{f=0}
赋给变量key
(找到无键线的末尾)
0
如果变量f
具有真值y(记住非零,非空字符串),则打印该行的第三个字段
答案 1 :(得分:1)
awk '/KEY1/ {print $3}' FS=,
结果
TRACKINGNUMBER1-1
TRACKINGNUMBER1-2
TRACKINGNUMBER1-3
TRACKINGNUMBER1-4
TRACKINGNUMBER1-5
答案 2 :(得分:0)
$ sed -nr '/^KEY1/, /^KEY/ { /^(KEY1| )/!d; s/.*(TRACKINGNUMBER[^,]+).*/\1/ p}' input
TRACKINGNUMBER1-1
TRACKINGNUMBER1-2
TRACKINGNUMBER1-3
TRACKINGNUMBER1-4
TRACKINGNUMBER1-5
答案 3 :(得分:0)
再多一次awk
awk -F, '/KEY1/,/KEY/{print $3}' file
或给出样本数据
awk 'match($0,/([^,]+NUMBER1[^,]+)/,a){print a[0]}'
甚至
awk -F, '$3~/NUMBER1/&&$0=$3' file