繁体   English   中英

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

[英]Break a one-line file to a multi-line file, each line with the same number of words?

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

741 12 3 24 45 123 32 111 34

假设每个单词的字数为3 那么目标是:

741 12 3
24 45 123
32 111 34

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

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

假设光标在该行的开头。 你可以尝试(在键入NORMAL模式):

100@='3f r^M'

然后输入Enter

宏也可以由qn3f r<Enter>q记录,那么您只需100@n

注意

  • 您需要输入<CV><Enter>^M
  • 我没有计算宏应该执行多少次,因此只给出了100。如果结果超过100行,则给出500或1000。:)
  • 如果给定数字有问题,例如行不能被3除,那么最后一行可能包含少于给定数字的列。 例如3。
cat your_file | tr " " "\n" | paste -s -d "  \n"

尝试这个

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

它产生

741 12 3
24 45 123
32 111 34

这是使用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"

一种使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM