将gensub应用于awk中所有字段的简短方法

时间:2016-09-08 00:36:48

标签: linux bash awk gawk

我有这个awk命令,用不同的字段读取单行xml。我不得不逐个在所有领域使用gensub。

假设这是我的xml文件

<users><user><a>1</a><b>2</b><c>3</c></user></users>

我想要的输出是

1--2--3

另外我想从命令行使用,如果可能的话我想要一个班轮。 有没有办法让这个命令简短

awk -v FS='><' -v RS="</?user>" '{
    a=gensub(/.*>(.*)<.*/, "\\1",  "g", $1); 
    b=gensub(/.*>(.*)<.*/, "\\1",  "g", $2); 
    c=gensub(/.*>(.*)<.*/, "\\1",  "g", $3); 
    print a"--"b"--"c}' abc.xml

2 个答案:

答案 0 :(得分:1)

$ awk -F'<[^>]+>' -v OFS='--' '{print $4, $6, $8}' file
1--2--3

如果那不是您想要的,那么请编辑您的问题,以提供更具真实代表性的样本输入和预期输出。

鉴于您的评论中提供了新的输入格式:

$ cat file
<users><user><a>1</a><b>2</b><c>3</c><user><a>1</a><b>2</b><c>3</c><user><a>1</a><b>2</b><c>3</c></user></users>

$ awk -v RS='</?user>' -F'<[^>]+>' -v OFS='--' 'RT&&(NR>1){print $2, $4, $6}' file
1--2--3
1--2--3
1--2--3

以上需要GNU awk用于多字符RS和RT。

答案 1 :(得分:0)

awk

awk -v FS="[^[:digit:]]+" -v OFS="--" -v RS="<(/)?user(s)?>" 'NF{print $2,$3,$4}' file

输出

1--2--3

击穿

FS="[^[:digit:]]+" #matches non-digit string and takes it as FS
OFS="--" #Output FS
RS="<(/)?user(s)?>" # RS for users/user tag
NF{print $2,$3,$4} #print the first 3 digits if any fields are present