【问题标题】:Print columns in reverse order from csv file从 csv 文件以相反的顺序打印列
【发布时间】:2016-01-07 12:04:41
【问题描述】:

输入文件

cityId;cityName;numOfBranches;numOfAtms
1;san bruno;7;11
3;milbrae;12;27

我想以相反的顺序打印列,如下所示:

numOfAtms;numOfBranches;cityName;cityId
11;7;san bruno;1
27;12;milbrae;3

写了python来反转csv文件,但是需要相当长的时间。 有什么办法可以在 bash 中做到这一点?

【问题讨论】:

    标签: bash csv


    【解决方案1】:

    使用awk:

    awk 'BEGIN{FS=OFS=";"} {s=$NF; for (i=NF-1; i>=1; i--) s = s OFS $i; print s}' file
    numOfAtms;numOfBranches;cityName;cityId
    11;7;san bruno;1
    27;12;milbrae;3
    

    【讨论】:

    • 这正是我正在寻找的东西。 +1
    【解决方案2】:

    你也可以使用 sed

        while read line
        do
            echo $line | sed s/'\(.*\);\(.*\);\(.*\);\(.*\)/\4;\3;\2;\1/'
        done
    

    在 shell 中你可以给出命令 ./reverse_pattern.sh

    您可以使用此脚本使其通用

                #!/bin/bash
                outputpat=
                inputpat=
                patternform=
                delimiter=\;
    
                #calulate num delimiter and form pattern
                form_pattern()
                {
                        count=$(echo "$1"|grep -o "$delimiter"| wc -w)
                        for((i=count+1;i>1;i--))
                        do
                                outputpat="$outputpat\\$i$delimiter"
                        done
    
                        outputpat="$outputpat\\$i"    #last word not followed by ;
    
                        for((i=0;i<count;i++))
                        do
                                inputpat="$inputpat\\(.*\\)$delimiter"
                        done
                        inputpat="$inputpat\\(.*\\)" #last word not followed by ;
                        patternform=yes
                }
    
                while read line
                do
                        if [ -z $patternform ]
                        then
                                form_pattern $line
                        fi
                        echo $line | sed s/$inputpat/$outputpat/
                done
    

    【讨论】:

    • 是的,Varun,另一个技巧。一个问题:我们怎样才能使它通用,以便处理输入文件中的任意数量的列?
    • 我把它变成了通用的。见上述程序
    【解决方案3】:

    使用具有内置reverse功能的perl

    $ perl -F';' -lane 'print join ";", reverse @F' ip.csv
    numOfAtms;numOfBranches;cityName;cityId
    11;7;san bruno;1
    27;12;milbrae;3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多