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