输入文件
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中做到吗?
答案 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