如何将 csv 行中的每个字符串分隔为行

yae*_*ael 0 linux sed awk text-processing csv

我们想将 csv 行中的每个字符串分隔为行

线的例子(可能是其他线,具有相同的概念)

machine23,machine094,machine73,machine83
Run Code Online (Sandbox Code Playgroud)

所以我们试试这个

echo machine23,machine094,machine73,machine83 |awk -F"," '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}'
Run Code Online (Sandbox Code Playgroud)

但我们得到

machine23   machine094  machine7  machine83 
Run Code Online (Sandbox Code Playgroud)

而是获得以下预期结果

machine23
machine094 
machine7 
machine83 
Run Code Online (Sandbox Code Playgroud)

有什么建议?

cas*_*cas 5

$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83
Run Code Online (Sandbox Code Playgroud)

或者如果您真的想在 awk 中执行此操作(可能是因为您想在 awk 中进行进一步处理):

$ echo machine23,machine094,machine73,machine83 | \
  awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83
Run Code Online (Sandbox Code Playgroud)

这使用了一个巧妙的 awk 技巧,如果您更改任何字段(即使将其设置为等于自身,如 in $1=$)然后设置$0=$0, awk 将重新格式化整个输入行 - 将原始字段分隔符(FS,在这种情况下为逗号)替换为输出字段分隔符(OFS在这种情况下为换行符)。

  • 啊,我明白你的意思了——你记得在哪里可以删除已删除的字段的情况是`echo 'abc' | awk '{$2="";$0=$0;$1=$1}1'`。首先删除字段内容,然后重新拆分(现在 a 和 c 之间的 2 个空格是一个 FS,因此 3 个字段现在是 2),然后将 $0 更改 FS(包括 2 个连续空格)重新组合为 OFS(a单个空白)。 (2认同)
  • 是的,就是这样。谢谢。 (2认同)