1

例如,单行文件line.txt具有以下行:

741 12 3 24 45 123 32 111 34

假设指定每个单词的数量是3。那么目标是:

741 12 3
24 45 123
32 111 34

在这种情况下,哪些脚本可以提供帮助,一个简单的脚本将不胜感激。

4

5 回答 5

5

这对 awk 来说是一件容易的事。我也看到了这个问题vim,然后用 vim 尝试了一下。

假设光标位于行首。您可以尝试输入(在NORMAL模式下):

100@='3f r^M'

然后键入Enter

宏也可以录制qn3f r<Enter>q,然后你就100@n

笔记

  • ^M你需要输入<C-V><Enter>
  • 我没有计算你应该做多少次宏,所以只给了 100。如果结果超过 100 行,你只给 500 或 1000。:)
  • 如果给定数字有问题,例如该行不能被 3 整除,那么最后一行可能包含小于给定数字的列。例如 3。
于 2013-03-15T22:19:28.017 回答
2
cat your_file | tr " " "\n" | paste -s -d "  \n"
于 2013-03-16T01:10:31.513 回答
2

试试这个

printf "%s %s %s\n" $(cat line.txt)

它产生

741 12 3
24 45 123
32 111 34
于 2013-03-16T13:48:16.317 回答
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"
于 2013-03-15T22:05:09.137 回答
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
于 2013-03-15T22:05:58.267 回答