交换两列 – 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到最后一列的范围。 正如您可能已经猜到的那样,在方括号内,您可以按所需的顺序放置任何一列或一列的列。