web-dev-qa-db-ja.com

ファイルの行から列への変換

ファイルがあるとしましょう:

ファイル1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

File2欲しい:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

File1の行から列への変換。

16
yisha

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番目の行などの結果が出力されます。もちろん、入力ファイルはメモリサイズに制限されます。

21
αғsнιη

あなたは単にgrepを通じてこれを行うことができます。デフォルトでは、grepは一致を別の改行で出力します。

grep -oP '\S+' infile > outfile

OR

grep -o '[^[:space:]]\+' infile > outfile
8
Avinash Raj

fmtコマンドを使用することもできます。

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
8
fredtantini

GNU datamash の場合:

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
7
cuonglm

sedを使用してこれを行うこともできます。

$ sed -e 's/  */\n/g' file1 > file2

注:単語にスペースが含まれている状況を処理しません。

6
slm

awkを使用して、出力フィールド区切り記号(OFS)をレコード(行)区切り記号(RS)として設定します。

awk '{OFS=RS;$1=$1}1' file > file2
5
jasonwryan

forループの使用:

for val in `cat file1` ; do echo $val >> file2; done;
2
Mandar Shinde

sedを使用することもできます

$ sed -i.bak s@' '@'\n'@g infile.txt

置換操作の区切り記号として@を使用していることに注意してください。これにより、バックアップファイルも作成されます。バックアップが必要ない場合は、.bakを削除してください

$ sed -i s@' '@'\n'@g infile.txt
0
Vaibhav Shetye

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
_
0

xargsを使用して、( souravcの答え から盗まれます):

xargs -n 1 < File1 > File2

または、マイナーな再フォーマットが必要な場合は、必要に応じてprintf形式の文字列を使用します。

xargs printf '%s\n' < File1 > File2
0
agc

私の解決策は:

#!/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
0