2017-04-26 33 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个空格字符