代码之家  ›  专栏  ›  技术社区  ›  frankc

在带分隔符的文件中,将一列复制到另一列上

  •  1
  • frankc  · 技术社区  · 15 年前

    例如,我需要删除第25列,并将其替换为一个简单的csv文件中没有嵌入分隔符的第22列的副本。我能想到的最好的办法就是难看的样子:

    awk -F, '{ for(x=1;x<25;x++){printf("%s,", $x)};printf("%s,",$22);for(x=26;x<59;x++){printf
    ("%s,", $x)};print $59}'
    
    我想买点像
    cut -d, -f1-24,23,26-59 
    
    但Cut似乎不想两次打印同一列…

    有没有一种更优雅的方法可以在Linux shell环境中使用任何典型的可用工具?

    3 回复  |  直到 13 年前
        1
  •  4
  •   jamessan    15 年前

    只需告诉awk将字段25替换为字段22即可。

    awk 'BEGIN{FS=","; OFS=","} {$25=$22; print}' < test.csv
    
        2
  •  0
  •   Kaleb Pederson    15 年前

    它不优雅,但是 paste 是其中的一部分 coreutils 应该是可用的,但需要一些临时文件:

    $ cat test.csv
    one,two,three,four,five,six,seven
    1,2,3,4,5,6,7
    $ cut -d, -f1-5 test.csv > start.txt
    $ cut -d, -f3 test.csv> replace.txt
    $ cut -d, -f7 test.csv > end.txt
    $ paste -d, start.txt replace.txt end.txt
    one,two,three,four,five,three,seven
    1,2,3,4,5,3,7
    

    或者,您可以跳过最后一个临时文件并使用标准输入:

    $ cut -d, -f7 test.csv | paste -d, start.txt replace.txt -
    one,two,three,four,five,three,seven
    1,2,3,4,5,3,7
    
        3
  •  0
  •   potong    13 年前

    这可能对您有用:

    echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' |
    sed 's/^\(\([^,]*,\)\{21\}\([^,]*,\)\([^,]*,\)\{2\}\)[^,]*,/\1\3/'
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26
    

    或者如果你喜欢:

    echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' | 
    sed -r 's/^(([^,]*,){21}([^,]*,)([^,]*,){2})[^,]*,/\1\3/'
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26