所以我有一个包含 2 列的文件,如下所示:
10 1
11 2
12 3
13 4
14 5
我想使用 cut 命令切换列。我用过
paste <(cut -f2 file.dat) <(cut -f1 file.dat)
它给了我以下内容:
10 1 10 1
11 2 11 2
12 3 12 3
13 4 13 4
14 5 14 5
有人知道我如何使用cut
和paste
切换列吗?我以为cut -f1
orcut -f2
会剪切每个字段,但显然不是?我在这里做错了什么?
更新:所以我使用的是-d
而不是f
,它给了我奇怪的结果,但当我的cat
文件,内容保持不变?
答案1
默认分隔符cut
是制表符 - 如果您想要以cut
空格分隔数据,则需要使用参数指定-d
。
您的输入文件似乎使用多种的增加难度的空格:
paste <(cut -d' ' -f5 file.txt) <(cut -d' ' -f3 file.txt)
1 10
2 11
3 12
4 13
5 14
或者您可以用制表符替换空格(挤出重复) - 请注意,字段将变为-f3
和 ,-f2
因为您的文件具有前导空格:
paste <(tr -s ' ' '\t' < file.txt | cut -f3) <(tr -s ' ' '\t' < file.txt | cut -f2)
awk
在这种情况下,使用例如会更简单
awk '{print $2,$1}' file.txt
或者
awk '{print $2,$1}' OFS='\t' file.txt
如果您想要制表符分隔的输出(正如您从 获得的那样paste
)例如。
$ awk '{print $2,$1}' OFS='\t' file.txt
1 10
2 11
3 12
4 13
5 14
答案2
所以我想出了我想用以下内容做什么:
cut -d' ' -f1 file.txt > f1.txt
剪切第一列并将其附加到新文件 f1.txt
cut -d' ' -f4 file.txt > f2.txt
剪切第二列并将其附加到新文件 f2.txt
paste f2.txt f1.txt > file.txt
最后用切换的列覆盖原始 file.txt。