1

たとえば、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 にとっては簡単な作業です。私も質問を見て、vimvimで少し試してみました。

カーソルが行頭にあるとします。NORMAL(モードで)次のように入力してみてください。

100@='3f r^M'

を入力しEnterます。

マクロも記録できますqn3f r<Enter>q100@n

ノート

  • 入力する^M必要がある<C-V><Enter>
  • マクロを何回実行する必要があるかを計算していないので、100 を指定しました。結果が 100 行を超える場合は、500 または 1000 を指定します。:)
  • 行を 3 で割ることができないなど、指定された数値に問題がある場合、最後の行には指定された数値よりも少ない列が含まれる可能性があります。例 3.
于 2013-03-15T22:19:28.017 に答える
2

これを試して

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

それは得ます

741 12 3
24 45 123
32 111 34
于 2013-03-16T13:48:16.317 に答える
2
cat your_file | tr " " "\n" | paste -s -d "  \n"
于 2013-03-16T01:10:31.513 に答える
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 に答える