grep /在csv中搜索字符串,然后解析该行并执行另一个grep

时间:2014-12-03 18:01:54

标签: linux parsing csv sed grep

标题的措辞可能不是很好,但我目前需要编写一个在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”

4 个答案:

答案 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