1

我有一个大的制表符分隔的 txt 文件,其中包含 22 列和最多 10^6 行。该文件的第 7 列是一个 11 个字符的字符串,我需要编辑如下:最后 5 个字符(chr 7-11)需要是前 5 个字符。

例如,当前文件如下所示:

col1a col2a col3a col4a col5a col6a XXXXXXAAAAA col8a ...
col1b col2b col3b col4b col5b col6b XXXXXXBBBBB col8b ...
col1c col2c col3c col4c col5c col6c XXXXXXCCCCC col8c ...
col1d col2d col3d col4d col5d col6d XXXXXXDDDDD col8d ...
....

所需的输出是:

col1a col2a col3a col4a col5a col6a AAAAAXXXXXX col8a ...
col1b col2b col3b col4b col5b col6b BBBBBXXXXXX col8b ...
col1c col2c col3c col4c col5c col6c CCCCCXXXXXX col8c ...
col1d col2d col3d col4d col5d col6d DDDDDXXXXXX col8d ...
....

在我看来,这样做的一种方法是将相关列分成两个 using cut,然后将它们再次组合 using paste?到目前为止,我只在多个步骤中做到了这一点(原始文件名很短):

1) 使用awkandcut创建两个新文件,每半列一个

awk ' BEGIN { FS="\t"; OFS="\t" } {print $7} ' short | cut -c1-6 > file1
awk ' BEGIN { FS="\t"; OFS="\t" } {print $7} ' short | cut -c7-11 > file2

2)paste用于将它们粘贴在一起

paste -d "" file2 file1 > file12

3)paste用于将新文件粘贴到原始文件

paste -d"\t" short file12 > shortCom

4) 使用 'awk' 将原始第 7 列替换为新列:

awk ' BEGIN { FS="\t"; OFS="\t" } {
$7 = $23
print $0 } ' shortCom

这显然是一个非常漫长而繁琐的过程来做一些我怀疑实际上非常简单的事情......我将非常感谢您对改进这一点的任何建议,以使其更快更有效。

谢谢!!

4

1 回答 1

1

这应该有效:

awk '{y=substr($7,1,5);z=substr($7,6); $7=z""y;}1' inputfile

如果你有gnu awk那么:

gawk '{$7=gensub(/(.{5})(.{6})/ , "\\2\\1" , "g" , $7)}1' inputfile
于 2013-05-29T16:30:39.743 回答