たとえば、1 行のファイル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
ノート
^M
必要がある<C-V><Enter>
これを試して
printf "%s %s %s\n" $(cat line.txt)
それは得ます
741 12 3
24 45 123
32 111 34
cat your_file | tr " " "\n" | paste -s -d " \n"
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