我需要转置 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
将回车符视为最后一个字段的一部分。换行符是记录分隔符。