가변 길이 CSV 파일에서 열 선택

가변 길이 CSV 파일에서 열 선택

ID와 같이 각 파일의 각 행에 고유한 열을 공유하는 두 개의 CSV 파일이 있습니다. 이 파일에는 제목이 없습니다. file_2에는 다음과 같은 가변 길이 열이 있습니다.

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

먼저 sort 명령을 사용하여 정렬하고 해당 열에 대한 조인을 사용하여 공통 열을 기반으로 두 필드를 조인했습니다. 이제 가변 길이 열이 포함된 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

이 세 개의 열을 얻을 수 있습니다. 하지만 나머지는 어떻게 해야할지 모르겠습니다. 나는 파이썬에서 이것을하는 방법을 알고 있습니다. 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

관련 정보