例如,如果文件中的单词(或字符串)用空格分隔,如下所示:

cat bat mat ram sdk kgb fsb cia

这应该在每6个单词后改为新行,并用逗号分隔这些单词?不知道如何使用awk
cat ,bat, mat ,ram ,sdk ,kgb (new line )
fsb ,cia

最佳答案

这实际上是一件相当棘手的事情。以下是几种方法:
sed:将所有空格转换为逗号,然后用换行符替换每6个逗号。

sed -r 's/[[:blank:]]+/,/g; s/([^,]+(,[^,]+){5}),/\1\n/g' file

awk,打印每个字段并决定每个字段使用什么分隔符。
awk '{
    for (i=1; i<=NF; i++)
        printf "%s%s", $i, (i == NF ? "" : ( i%6 == 0 ? "\n" : ","))
    print ""
}' file

猛击
myjoin() { local IFS=$1; shift; echo "$*"; }
while read -ra words; do
    while (( ${#words[@]} > 0 )); do
        myjoin , "${words[@]:0:6}"
        words=( "${words[@]:6}" )
    done
done < file

我最喜欢这个:tr将空白转换成换行;paste每行打印6个字段;sed清除最后一行的尾随逗号
tr -s '[:blank:]' '\n' < file | paste -d, - - - - - - | sed '$s/,\+$//'

不过,这个方法的操作与其他方法不同:如果输入文件有3行8个字,那么所有其他方法都将输出6行、带有6个字段的奇数行和带有2个字段的偶数行。这个答案将打印4行,全部有6个字段。所以,这取决于你的需要。

关于linux - 如何用文件中的新行替换每6次出现的空白?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29185037/

10-10 14:14