【问题标题】:string manipulation within file column in unixUnix中文件列中的字符串操作
【发布时间】:2013-05-25 00:45:15
【问题描述】:

我有一个大的制表符分隔的 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) 使用awkcut 创建两个新文件,每半列一个

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

这显然是一个非常漫长而繁琐的过程,我怀疑它实际上非常简单......我将非常感谢您对改进它提出的任何建议,以使其更快、更高效。

谢谢!!

【问题讨论】:

    标签: unix awk paste cut


    【解决方案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
    

    【讨论】:

    • 我现在意识到我在给出的示例中犯了一个小错误(现已更正),但是我设法使用了您建议的代码,并且效果很好!谢谢!
    • +1 您并不严格需要空字符串:$7 = z y。我希望 awk 有一个具体的串联运算符
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2013-04-21
    • 2018-11-04
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多