将单行文件拆分为多行文件,每行具有相同数量的单词?

时间:2013-03-15 22:01:11

标签: bash vim

E.g。单行文件line.txt包含以下行:

741 12 3 24 45 123 32 111 34

假设指定每个单词的数量为3。然后目标是:

741 12 3
24 45 123
32 111 34

在这种情况下,哪些脚本可以提供帮助,我们将不胜感激。

5 个答案:

答案 0 :(得分: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。

答案 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