ファイルがあるとしましょう:
ファイル1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2欲しい:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
File1の行から列への変換。
tr
を使用して、繰り返される各空白文字()を単一の改行(\n
) キャラクター。
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a# a b c d-> 2 b $ #$ @%3 c @ 4 d%
awk
を使用すると、次のことができます。
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
これにより、同じフィールド番号の各位置が結合され、END
に、最初の列の最初の行、2番目の列の2番目の行などの結果が出力されます。もちろん、入力ファイルはメモリサイズに制限されます。
あなたは単にgrepを通じてこれを行うことができます。デフォルトでは、grepは一致を別の改行で出力します。
grep -oP '\S+' infile > outfile
OR
grep -o '[^[:space:]]\+' infile > outfile
fmt
コマンドを使用することもできます。
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
GNU datamash の場合:
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
sed
を使用してこれを行うこともできます。
$ sed -e 's/ */\n/g' file1 > file2
注:単語にスペースが含まれている状況を処理しません。
awk
を使用して、出力フィールド区切り記号(OFS
)をレコード(行)区切り記号(RS
)として設定します。
awk '{OFS=RS;$1=$1}1' file > file2
for
ループの使用:
for val in `cat file1` ; do echo $val >> file2; done;
sed
を使用することもできます
$ sed -i.bak s@' '@'\n'@g infile.txt
置換操作の区切り記号として@
を使用していることに注意してください。これにより、バックアップファイルも作成されます。バックアップが必要ない場合は、.bakを削除してください
$ sed -i s@' '@'\n'@g infile.txt
Pythonバージョン:
_python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
_
これは、_<
_リダイレクトを使用して、_input.txt
_からPythonのstdinにリダイレクトし、_output.txt
_リダイレクトを使用して_>
_に書き込みます。ワンライナー自体がstdin
からのすべての行を文字列のリストに読み込みます。すべてのスペースは改行で置き換えられ、.join()
関数を使用してテキスト全体を再構築します。
連続する複数のスペースが改行で置き換えられるのを回避する別の方法は、.split()
を使用して行を単語のリストに分割することです。そうすることで、各単語が1つの改行で区切られていることを確認できます。
_python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
_
xargs
を使用して、( souravcの答え から盗まれます):
xargs -n 1 < File1 > File2
または、マイナーな再フォーマットが必要な場合は、必要に応じてprintf
形式の文字列を使用します。
xargs printf '%s\n' < File1 > File2
私の解決策は:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done