python sed awk_关于交换两列:交换两列-awk,sed,python,perl

这篇博客讨论了如何在Linux环境中,针对一个包含280列和700万行的大文件,有效地交换前两列。作者提到了awk命令的使用,以及在处理不同列数和分隔符时的注意事项。解决方案包括使用awk的字段替换技巧,以及在某些情况下使用Perl或sed。此外,还提到了cut命令和其他方法作为替代方案。
摘要由CSDN通过智能技术生成

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

该文件以制表符分隔:

Affy-id chr 0 pos NA06984 NA06985 NA06986 NA06989

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

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

那是如此整洁优雅,谢谢!我希望那里能有一个班轮。

对于不同大小的色谱柱及其分隔符,此答案存在问题。更多可扩展的答案在这里unix.stackexchange.com/a/31596/16920

实际上,使用不同的列数(仅使用混合的分隔符)不会出现问题:例如,如果文件中同时包含制表符和空格,并且只想按制表符分隔字段,则需要BEGIN{FS=\t}技巧。

或awk命令更整洁的-F\t选项!

使用-F \t选项卡在最终输出中被吃掉了。有没有办法保存它们?

好的,必须指定OFS=$\t,如以下答案所指出。 @perreal,也许值得用附加参数更新答案吗?

如果使用:awk { print $2, $1}是相同的:D

这真的很有帮助!感谢分享!

我在带有制表符分隔文件的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

超!我错过了OFS=$\t参数!

这种方法可以在行的开头以制表符结尾。可能不是预期的结果。

试试这个与您的问题更相关的方法:

awk '{printf("%s\t%s

", $2, $1)}' inputfile

这仅打印前两列。 awk {print $2"\t" $1} inputfile稍微紧凑一些。

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

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

您是否尝试过使用cut命令?例如。

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

我还没有,但我会记得以后再用!

-c =字符...因此不会交换列。

它将交换输出文件中的列-自己尝试

不知道字符数怎么办? cat myhugefile | cut -f2,1提供与cat myhugefile | cut -f1,2相同的输出

您可以将每一列输出到一个中间文件。类似于:cut -f2 myhugefile> piece1;切-f1 myhugefile> piece2 |粘贴piece1 piece2> myrearrangedhugefile; rm piece1; rm piece2

这在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到最后一列的范围。您可能已经猜到了,您可以在方括号内按所需顺序放置任何单列或列范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值