将 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。
我有这个 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。