我有一个像这样的文件
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