Shell-Script

從可變長度的 csv 文件中選擇列

  • April 2, 2018

我有兩個 CSV 文件,它們共享一個對於每個文件中的每一行都是唯一的列,例如一個 ID。這些文件沒有標題。file_2 具有可變長度列,例如

1,2,3
4,5,6,7,8

我首先通過使用排序命令排序並在該列上使用連接來加入基於公共列的兩個欄位。現在我有一個帶有可變長度列的 csv 文件。

我想按以下順序選擇列:

second column, first column, third column, {from 4th column onwards every 3rd column till end of row. e.g., 4,7,10...}

我試過awk -F "\"*,\"*",\"*" '{print $2 $1 $3}' joinedfile.csv

並且能夠得到這三列。但是沒有想法處理其餘的。我知道如何在 python 中做到這一點。我想知道如何在 shell 命令(如 cut 或 awk)中執行此操作。我猜 awk 中的 while 循環可能會有所幫助,但不確定如何建構。

就像是:

awk -F, '{
   # print first three columns
   printf("%s,%s,%s", $2,$1,$3);

   #for all other columns
   for ( i = 4; i < NF; i++ )
   {
       # if column number every third
       if ( ( i - 4 ) % 3 == 0) {
           printf(",%s", $i);
       }
   }
   #print newline
   print "";
}' your_file.csv

純 shell,只要少於 26 列就應該可以工作:

while IFS=, read a b c d e f g h i j k l m n o p q r s t u v w x y z
do 
   printf '%s,' $b $a $c $d $g $j $m $p $s $v $y
   printf '\b \b\n' 
done < joinedfile.csv

如果有超過26 列,試試這個:

tr , ' ' < joinedfile.csv | 
while read a; do 
   set -- $a
   printf '%s,' $2 $1 $3
   while [ "$4" ] ; do 
       shift 3
       printf '%s,' "$1"
   done
   printf '\b \b\n'
done

引用自:https://unix.stackexchange.com/questions/214077