例如,如果一个文件包含由空格分隔的单词(或字符串),如下所示:
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/