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

Short way to apply gensub to all fields in awk

我有这个 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", ); 
    b=gensub(/.*>(.*)<.*/, "\1",  "g", ); 
    c=gensub(/.*>(.*)<.*/, "\1",  "g", ); 
    print a"--"b"--"c}' abc.xml

awk

awk -v FS="[^[:digit:]]+" -v OFS="--" -v RS="<(/)?user(s)?>" 'NF{print ,,}' 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 ,,} #print the first 3 digits if any fields are present
$ awk -F'<[^>]+>' -v OFS='--' '{print , , }' 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 , , }' file
1--2--3
1--2--3
1--2--3

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