使用剪切转置列的问题

时间:2017-04-26 13:26:10

标签: bash sh transpose cut

我想将一个3列的文本文件转换为三个单独的文件,每个文件各占一行。 换句话说,拿这个文件:

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来做到这一点:

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)

如果awk可用,速度会快一点

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

请注意:   - >而不是>>因为awk仅在文件打开时评估重定向(所以创建而不是在这种情况下添加)

对于您的剪切问题,是列

之间的分隔符总是1个空格字符

答案 1 :(得分:0)

您的问题很可能是您输入的文字标签而不是\t的分隔符,这是一个执行所有三个文件的循环:

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

这里我们循环一个{1..3}的序列,使用特殊语法将分隔符设置为tab:-d$'\t',将数据传递给column,这会自动排列值并附加到正确的文件。