例如,如果文件中的单词(或字符串)由空格分隔,如下所示:
cat bat mat ram sdk kgb fsb cia
这应该在每第6个单词后改为新行,并用逗号分隔这些单词?不知道如何使用awk
来做到这一点cat ,bat, mat ,ram ,sdk ,kgb (new line )
fsb ,cia
答案 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个字段。所以,取决于你的需要。