2017-04-26 3 views
0

3列のテキストファイルを1行ずつ3つの別々のファイルに転記したい。次の3つのファイル問題を使って列を転置するときに問題が発生する

1 22 0.8 
4 21 0.73 
3 30 1.56 
5 12 0.92 

in_fileおよび生産:つまり 、このファイルを取る

out_file1

1 4 3 5 

out_file2

22 21 30 12 

out_file3

0.8 0.73 1.56 0.92 

私はこれを行うには、カットを使用しようとしました:

cut -d' ' -f1 in_file | tr -s '\n' '\t' >> out_file1 
cut -d' ' -f2 in_file | tr -s '\n' '\t' >> out_file2 
cut -d' ' -f3 in_file | tr -s '\n' '\t' >> out_file3 

しかし、私は何を得ることはこれです:

out_file2

out_file1

1 4 3 5 

それは最初の2列に対して機能し、第三ない理由

out_file3

0.8 
    0.73 
    1.56 
    0.92 

私が把握することはできません。

助けてくれてありがとうございます! awkがavailbleである場合

+0

デリミタは常に1つの空白ですか? –

+0

区切り文字は常にタブです。 実際、私は上記の私の記事に間違いがあったことに気付きました。今、out_file3が実際どのように見えるかを更新しました(各行の冒頭にある新しいタブ)。 – Neuroguy

+0

入力区切り文字 - タブまたはスペースですか? スペースが1つの場合、コードは私のために働きます(centos 6。5) あなたは 'cat in_file | tr -s "" 'の前にカット – mousomer

答えて

0

あなたの問題は、\t、hの代わりにリテラルタブとして入力した区切り記号の可能性が高いです、{1..3}のsequense以上

for i in {1..3}; do 
    cut -d$'\t' "-f${i}" in_file | column >> "outfile_${i}.txt" 
done 

ここでループ特殊な構文を持つタブに区切り文字を設定します:EREは、3つのすべてのファイルを行いループだ-d$'\t'、パイプデータ値アップcolumnれ、自動的にラインへと追加しますそれを正しいファイルに追加します。

+0

入力していただきありがとうございます。私はリテラルタブの代わりに-d $ '\ t'を指定しようとしましたが、同じ結果が得られます。 しかし、問題は\ nだったとわかりました。私が読んでいるテキストファイルは、PHPで書かれたスクリプトによって生成されます。このスクリプトでは、改行はunixの\ nとは対照的に\ r \ nです。 – Neuroguy

+0

タブはデフォルトの区切り文字なので、 '-d'オプションをスキップするだけでよいはずです。 –

0

Aは、より高速なビット

awk '{ for(i=1; i<=NF; i++) printf("%s ", $i) > ("file" i)}' YourFile 

注: - >なく>> awkはファイルのみ開口部にリダイレクトを評価する(そう作成し、この場合には追加しない)

ためのであなたのカット問題は区切り文字で常に1列の空白文字です

関連する問題