交换两列 – awk,sed,python,perl

我有一个大文件(280列宽,700万行!)的数据,我需要交换前两列。 我想我可以用某种awk for循环,打印$ 2,$ 1,然后范围到文件的结尾 – 但我不知道如何做范围部分,我不能打印$ 2 ,$ 1,$ 3 … $ 280! 我在这里看到的大多数列交换的答案是特定于具有可pipe理的列数的小文件,所以我需要一些不依赖于指定每个列号的东西。

该文件是制表符分隔的:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989 

你可以通过交换前两个字段的值来做到这一点:

 awk ' { t = $1; $1 = $2; $2 = t; print; } ' input_file 

我用一个分隔标签的文件在Windows系统上尝试了cygwin的perreal的回答。 它没有工作,因为标准分隔符是空间。

如果遇到同样的问题,请尝试以下操作:

 awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file 

传入分隔符由-F $'\t'定义,分隔符由OFS=$'\t'

 awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file > output_file 

你尝试过使用cut命令吗? 例如

 cat myhugefile | cut -c10-20,c1-9,c21- > myrearrangedhugefile 

试试这与你的问题更相关:

 awk '{printf("%s\t%s\n", $2, $1)}' inputfile 

这可能适用于你(GNU sed):

 sed -i 's/^\([^\t]*\t\)\([^\t]*\t\)/\2\1/' file 

这在Perl中也很容易:

 perl -pe 's/^(\S+)\t(\S+)/$2\t$1/;' file > outputfile 

你可以在Perl中做到这一点:

 perl -F\\t -nlae 'print join("\t", @F[1,0,2..$#F])' inputfile 

-F指定分隔符。 在大多数shell中,你需要在另一个反斜杠前面加上另一个反斜杠来转义它。 在某些平台上-F自动暗示-n-a这样它们可以被丢弃。

对于您的问题,您不需要使用-l因为最后一列出现在输出中的最后一列。 但是,如果在不同的情况下,如果最后一列需要出现在其他列之间,那么必须删除换行符。 -l开关照顾这个。

连接中的"\t"可以更改为任何其他内容,以在输出中生成不同的分隔符。

2..$#F指定从2到最后一列的范围。 正如您可能已经猜到的那样,在方括号内,您可以按所需的顺序放置任何一列或一列的列。