如何使用剪切和粘贴 shell 命令转置表格的 x 和 y 轴

如何使用剪切和粘贴 shell 命令转置表格的 x 和 y 轴

我需要转置 450.000 × 15.000 制表符分隔字段的文件的 x 轴和 y 轴,因此我首先尝试使用名为 A.txt 的小型 5 × 4 测试文件:

x   column1 column2 column3

row1    0   1   2

row2    3   4   5

row3    6   7   8

row4    9   10  11

我试过这个:

for i in {1..4}; do cut -f"$i" A.txt | paste -s; done > At.txt

但它不能正常工作。

输出是:

X   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3
    2
    5
    8
    11

答案1

假设输入是带有制表符分隔字段的 Unix 文本文件,并且paste使用 GNU,则您的命令可以正常工作。在非 GNU 系统上,您必须使用

$ for i in {1..4}; do cut -f"$i" A.txt | paste -s - ; done
x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
column3 2       5       8       11

请注意告诉它读取标准输入的-参数。paste

你绝对会这样做不是想要在 450k 列上运行它,因为这需要读取文件 450000 次。您最好使用其他解决方案。

例如,参见“转置行和列”。


如果上面的命令在 DOS 文本文件上运行,它将在终端中产生以下输出:

x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
        11

将输出重定向到新文件并在vim编辑器中打开该文件将显示

x   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3^M   2^M 5^M 8^M 11^M

其中每个^M都是回车符(DOS 文本行末尾的额外字符)。这些回车符使光标移回到行的开头,这就是为什么终端最后一行上唯一可见的是制表符和11(它会覆盖其他列)。

通过运行 . 确保您的输入文件是 Unix 文本文件dos2unix A.txt

答案2

Cygwin 是一个Gnu 环境。问题是行结尾,MS-Windows 剂量行结尾不同。首先将文件通过 dos2unix(仅对文本文件执行此操作)。

我现在已经转载了。我将其通过od -ta管道传输到 ,因为我的终端将其呈现为与您的 dos cmd 不同(cmd 正在将回车符更改为换行符)。

#unix2dos A.txt
#for i in {1..4}; do cut -f"$i" A.txt | paste -s; done | od -ta
0000000   x  ht   r   o   w   1  ht   r   o   w   2  ht   r   o   w   3
0000020  ht   r   o   w   4  nl   c   o   l   u   m   n   1  ht   0  ht
0000040   3  ht   6  ht   9  nl   c   o   l   u   m   n   2  ht   1  ht
0000060   4  ht   7  ht   1   0  nl   c   o   l   u   m   n   3  cr  ht
0000100   2  cr  ht   5  cr  ht   8  cr  ht   1   1  cr  nl

解释:cut将回车符视为最后一个字段的一部分。换行符是记录分隔符。

相关内容