可変長CSVファイルから列を選択

可変長CSVファイルから列を選択

IDなど、各ファイルの各行に一意の列を共有する2つのCSVファイルがあります。このファイルにはタイトルがありません。 file_2 には、次の可変長列があります。

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

まず、 sort コマンドを使用してソートし、その列の結合を使用して、共通列に基づいて 2 つのフィールドを結合しました。これで、可変長列を含む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

これら3つの列を得ることができます。しかし、残りはどうすべきかわかりません。私はPythonでこれを行う方法を知っています。 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

純粋なシェルは、熱が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

関連情報