从csv文件以相反的顺序打印列

时间:2016-01-07 12:04:42

标签: bash csv

输入文件

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

我想以相反的顺序打印列:

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

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

3 个答案:

答案 0 :(得分:4)

使用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 :(得分:0)

您也可以使用sed

    while read line
    do
        echo $line | sed s/'\(.*\);\(.*\);\(.*\);\(.*\)/\4;\3;\2;\1/'
    done
在shell中你可以发出命令 ./reverse_pattern.sh< csv.txt,其中reverse_pattern.sh在脚本之上,csv.txt是输入文件

您可以使用此脚本将其设为通用

            #!/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

答案 2 :(得分:0)

使用具有内置 perl 函数的 reverse

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