E.g。单行文件line.txt
包含以下行:
741 12 3 24 45 123 32 111 34
假设指定每个单词的数量为3
。然后目标是:
741 12 3
24 45 123
32 111 34
在这种情况下,哪些脚本可以提供帮助,我们将不胜感激。
答案 0 :(得分:5)
vim
看到了问题,然后用vim尝试了一下。
假设光标位于行的开头。您可以尝试输入(NORMAL
模式):
100@='3f r^M'
然后输入Enter
。
宏也可以qn3f r<Enter>q
录制,然后只需100@n
注意强>
^M
您需要输入<C-V><Enter>
答案 1 :(得分:2)
cat your_file | tr " " "\n" | paste -s -d " \n"
答案 2 :(得分:2)
试试这个
printf "%s %s %s\n" $(cat line.txt)
产生
741 12 3
24 45 123
32 111 34
答案 3 :(得分:1)
这是使用sed的方法。将字数固定为3
,您可以执行以下操作:
sed 's/\( [^ ]* [^ ]*\) /\1\n/g' <filename>
如果要动态指定单词数,可以使用以下脚本动态创建正则表达式:
#!/bin/sh
test $# -eq 2 || (echo "Usage: $(basename "${0}") <filename> <#words>" && exit 1)
for i in $(seq 2 "${2}"); do
REGEX=" [^ ]*${REGEX}"
done
cat "${1}" | sed "s/\\(${REGEX}\\) /\\1\n/g"
答案 4 :(得分:1)
使用awk
的一种方式:
awk '{
for ( i = 1; i <= NF; i++ ) {
printf "%s%s", $i, (i % 3 == 0) ? "\n" : " "
}
}' line.txt
它产生:
741 12 3
24 45 123
32 111 34
编辑修复脚本(请参阅注释)以获取不是3的多个字段:
awk '
{
for ( i = 1; i <= NF; i++ ) {
printf "%s%s", $i, (i < NF && i % 3 == 0) ? "\n" : " "
}
}
END { printf "\n" }
' infile