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