如何将单行以逗号分隔的字段拆分为多行,每行包含特定数量的字段?

如何将单行以逗号分隔的字段拆分为多行,每行包含特定数量的字段?

我有一个像这样的文件

Hello,Hi,Hullo,Hammers,Based,Random

对于n=2,输出必须像这样

Hello,Hi
Hullo,Hammers
Based,Random

对于n=3,输出必须像这样

Hello,Hi,Hullo
Hammers,Based,Random

我如何使用 awk/sed 来完成此任务?

编辑:n是字段数量的一个因素

答案1

$ awk -v n=2 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi
Hullo,Hammers
Based,Random

$ awk -v n=3 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi,Hullo
Hammers,Based,Random

在您的问题中,您没有解决如何处理字段数量不整除的情况,n因此我也没有在这里解决它。

答案2

另一种使用 和tr的方法paste

对于n=2,

$ <input tr ',' '\n' | paste  -d ',' - -
Hello,Hi
Hullo,Hammers
Based,Random

对于n=3,

$ <input tr ',' '\n' | paste  -d ',' - - -
Hello,Hi,Hullo
Hammers,Based,Random

答案3

使用perl:

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | 
    perl -F, -le '
      BEGIN { $n = shift };
      for ($i=0; $i < @F; $i += $n) {
         print join(",", @F[$i .. ($i + $n - 1)]);
      }' 2
Hello,Hi
Hullo,Hammers
Based,Random

这使用第一个参数作为每个输出行打印的条目数(使用变量$n)。 STDIN 和任何文件名参数都用作输入。

由于该-F,选项(隐式启用-a-n选项),它会自动读取每个输入行并将其以逗号分隔为 array ,然后一次 @F迭代数组的索引。元素打印在每个输出行上。$n$n

注意:使用文本::CSV如果您需要解析带有引号字段和嵌入引号中的逗号的实际 CSV,而不是简单的逗号分隔输入,请使用模块。

输出参数为3而非2

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 3
Hello,Hi,Hullo
Hammers,Based,Random

再次4

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 4
Hello,Hi,Hullo,Hammers
Based,Random,,

答案4

awk再次输入由和 换行符
分隔的任何一组值,输出固定宽度的 csv:,

awk '{printf((FNR>1?(FNR-1)%n?",":ORS:"")$0)}END{print ""}' RS='[,\n]' n=4 <<END
Hello
Hi,Hullo,Hammers,Based
Random
END

Hello,Hi,Hullo,Hammers
Based,Random

相关内容