2017-04-26 70 views
0

我想將三列文本文件轉置爲三個單獨的文件,每行一行。 換句話說,藉此文件:使用剪切轉置列的問題

in_file中

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

和產生以下3個文件:

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_file1

1 4 3 5 

out_file2

22 21 30 12 

out_file3

0.8 
    0.73 
    1.56 
    0.92 

我想不通爲什麼它的工作原理進行第2列,而不是第三。

感謝您的幫助!

+0

你確定分隔符總是一個空格嗎? –

+0

分隔符總是一個選項卡。 其實,我意識到我的文章上面有一個錯誤 - 我現在已經更新了out_file3的實際外觀(每行開始處的新選項卡)。 – Neuroguy

+0

輸入分隔符 - 是標籤還是空格? 當它是一個單獨的空間時,您的代碼適用於我(centos 6。5) 您可以添加'cat in_file | tr -s「」'在切割前 – mousomer

回答

0

你的問題很可能是你輸入爲分隔符而不是\t,h ERE是一個循環,它的所有三個文件:

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

在這裏,我們遍歷的{1..3}一個sequense,設置分隔符選項卡與特殊的語法:-d$'\t',管道的數據column自動哪些行了值和追加那到正確的文件。

+0

感謝您的意見。我試着指定-d $'\ t'而不是一個文字標籤,但它會產生相同的結果。 但是,我發現問題是\ n。我正在閱讀的文本文件是由用PHP編寫的腳本生成的,其中新行是\ r \ n,而不是\ unix中的\ n。 – Neuroguy

+0

Tab是默認的分隔符,所以你應該可以跳過'-d'選項。 –

0

快一點,如果AWK是availble的

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

注: - >,而不是>>因爲AWK只在文件打開評價重定向(所以創作,而不是在這種情況下添加)

爲你的切割問題,是分隔符總是在列之間有1個空格字符