linux - 如何用文件中的新行替换每 6 次出现的空格?

标签 linux shell

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

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/

相关文章:

Android设备驱动程序制作节点

java - 从 Java 程序访问 Linux 环境变量

python - 在Linux上使用Python暂停和/或恢复音频

c++ - 传递由其他对象组成的对象数组作为对 C++ 中函数的引用?

iphone - xcode构建错误

linux - 来自 [ $var -eq 1 ] 的 "Unexpected operator"

linux - 为什么 "sudo -s"不要求密码就变成root用户

shell - 如何从 LaTeX 执行 shell 脚本?

javascript - 在 Node.js 脚本中运行两个脚本

linux - Bash脚本函数返回值问题