unix中文件列中的字符串操作

unix中文件列中的字符串操作,unix,awk,paste,cut,Unix,Awk,Paste,Cut,我有一个很大的以制表符分隔的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 col

我有一个很大的以制表符分隔的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 ...
....
在我看来,这样做的一种方法是使用
cut
将相关列剪切为两个,然后使用
paste
再次组合它们?到目前为止,我只在多个步骤中完成了这项工作(原始文件名很短):

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

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 -d"\t" short file12 > shortCom
4) 使用“awk”将原来的第7列替换为新的第7列:

awk ' BEGIN { FS="\t"; OFS="\t" } {
$7 = $23
print $0 } ' shortCom
这显然是一个非常漫长和繁琐的过程,我怀疑这是一个非常简单的过程。。。我将非常感谢您对改进这一点的任何建议,以使其更快、更有效

谢谢

这应该有效:

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
这应该起作用:

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

我现在意识到,我在给出的示例中犯了一个小错误(现在已更正),但是我成功地使用了您建议的代码,它工作得非常出色!谢谢大家!+1严格来说,您不需要空字符串:
$7=zy
。我希望awk有一个具体的连接运算符,我现在意识到我在给出的示例中犯了一个小错误(现在已更正),但是我设法使用了您建议的代码,它工作得非常出色!谢谢大家!+1严格来说,您不需要空字符串:
$7=zy
。我希望awk有一个具体的连接操作符