从可变长度 csv 文件中选取列

从可变长度 csv 文件中选取列

我有两个 CSV 文件,它们共享每个文件中每一行唯一的列,例如 ID。这些文件没有标题。 file_2 具有可变长度列,例如

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

我首先通过使用 sort 命令进行排序并在该列上使用 join 来连接到两个基于公共列的字段。现在我有一个带有可变长度列的 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 循环可能会有所帮助,但不确定如何构建。

答案1

就像是:

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

答案2

纯 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

相关内容