如何用文件中的新行替换每个第6个发生空白?

时间:2015-03-21 16:24:13

标签: linux shell

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

cat bat mat ram sdk kgb fsb cia

这应该在每第6个单词后改为新行,并用逗号分隔这些单词?不知道如何使用awk

来做到这一点
cat ,bat, mat ,ram ,sdk ,kgb (new line )
fsb ,cia

1 个答案:

答案 0 :(得分:1)

这实际上是一件非常棘手的事情。以下是几种方法:

  • 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
    
  • 的bash

    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个字段。所以,取决于你的需要。