ファイルがあるとします:
File1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2が欲しい:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
File1の行から列への変換。
ファイルがあるとします:
File1:
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# abcd-> 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
、1列目の1行目、2列目の2行目などの結果が出力されます。もちろん、入力ファイルはメモリサイズに制限されます。
これは単にgrepを使用して行うことができます。デフォルトでは、grepは、一致を別の改行で出力します。
grep -oP '\S+' infile > outfile
または
grep -o '[^[:space:]]\+' infile > outfile
grep
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
タスクに最適なツールのように思えますが、他にいくつのツールを使用できるかが魅力的です!
を使用してawk
、出力フィールド区切り記号(OFS
)をレコード(行)区切り記号()として設定しますRS
。
awk '{OFS=RS;$1=$1}1' file > file2
また、使用してみることができます 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
これは<
、Pythonのstdin input.txt
へのリダイレクトを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