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

Cha*_*ley 52 awk sed

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

该文件是制表符分隔的:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989
Run Code Online (Sandbox Code Playgroud)

per*_*eal 92

您可以通过交换前两个字段的值来完成此操作:

awk ' { t = $1; $1 = $2; $2 = t; print; } ' input_file
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用:`awk '{ print $2, $1}' ` 是一样的:D (7认同)
  • 对于不同尺寸的色谱柱及其分离器,这个答案是有问题的.这里有更多可扩展的答案http://unix.stackexchange.com/a/31596/16920 (3认同)
  • 好的,正如下面的 [answer](http://stackoverflow.com/a/29532554/2247039) 所指出的那样,必须指定 `OFS=$'\t'`。@perreal,也许值得用附加参数更新答案? (3认同)
  • 使用`-F'\ t'`标签在最终输出中被吃掉.有没有办法保存它们? (2认同)
  • @cornuz,没问题,请注意,您的建议仅打印 2 列。OP想要打印所有列而不仅仅是前两列。 (2认同)

emi*_*-le 19

我在带有制表符分隔文件的Windows系统上尝试使用cygwin进行perreal的回答.它不起作用,因为标准分隔符是空格.

如果您遇到同样的问题,请尝试以下方法:

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file
Run Code Online (Sandbox Code Playgroud)

-F $'\t'输入分隔符由输出分隔符和输出分隔符定义OFS=$'\t'.

awk -F $'\t' ' { t = $1; $1 = $2; $2 = t; print; } ' OFS=$'\t' input_file > output_file
Run Code Online (Sandbox Code Playgroud)

  • 极好的!我错过了`OFS=$'\t'` 参数! (2认同)
  • 这种方法可能会在行的开头出现制表符。可能不是预期的结果。 (2认同)

Pra*_*gar 10

尝试与您的问题更相关:

awk '{printf("%s\t%s\n", $2, $1)}' inputfile
Run Code Online (Sandbox Code Playgroud)

  • 这仅打印前两列。稍微更紧凑的是`awk '{print $2 "\t" $1}' inputfile`。 (7认同)

pot*_*ong 6

这可能对你有用(GNU sed):

sed -i 's/^\([^\t]*\t\)\([^\t]*\t\)/\2\1/' file
Run Code Online (Sandbox Code Playgroud)