嵌套的awk命令

jml*_*jml 0 bash shell awk

我有一个这种语法的文件:

foo:bar:value1,value2,value3,...:foo:bar
Run Code Online (Sandbox Code Playgroud)

我想得到没有固定长度的值列表(空格分隔):

value1 value2 value3 ...
Run Code Online (Sandbox Code Playgroud)

有没有办法在单个awk命令中执行此操作?而不是像这样的管道命令:

awk -F: '{print $3}' myfile.txt | awk -F, '{OFS=" "; $1 = $1; print $0}'
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 5

您可以使用 awk 的split()函数进行额外的拆分。

awk -F : '{ split($3, a, ","); print a[1], a[2], a[3] }' file
Run Code Online (Sandbox Code Playgroud)

  • +1,请注意更新的问题指出没有固定长度。为此,您可以使用“n=split()”来捕获元素的数量,然后循环“for (i=1; i<=n; ...)”打印“a[]”的值。 (2认同)

jay*_*ngh 5

如果您知道要获取csv分隔值的字段,那么您也可以使用gsub函数:

awk -F: '{gsub(/,/," ",$3);print $3}' file
Run Code Online (Sandbox Code Playgroud)

$ cat file
foo:bar:value1,value2,value3,value3:foo:bar
foo:bar:value1,value2:foo:bar
foo:bar:value1,value2,value3,value4,value5,value6:foo:bar
Run Code Online (Sandbox Code Playgroud)

$ awk -F: '{gsub(/,/," ",$3);print $3}' file
value1 value2 value3 value3
value1 value2
value1 value2 value3 value4 value5 value6
Run Code Online (Sandbox Code Playgroud)