CSV 파일에 새 줄을 추가하고 Unix에서 수정하는 방법

CSV 파일에 새 줄을 추가하고 Unix에서 수정하는 방법

저는 일반적으로 Unix를 처음 접했고 쉘 스크립팅을 배우기 시작했습니다. 다음 예제 줄이 포함된 CSV 파일을 사용하고 있습니다(항목당 4개의 항목이 있는 대용량 CSV 파일).

Table 1
Item ID   Time                  Available   Location 
0001      02/02/2021  08:00     Y           NJ
0001      02/02/2021  09:00     N           UT
0001      02/02/2021  10:00     Y           AZ
0001      02/02/2021  11:00     Y           CA
0002      02/02/2021  08:00     Y           NJ
0002      02/02/2021  09:00     N           UT
0002      02/02/2021  10:00     Y           AZ
0002      02/02/2021  11:00     Y           CA      

다음과 같은 여러 프로젝트 ID가 포함된 또 다른 CSV가 있습니다.

Table 2
Item ID   Item_Name   Item_Aux_ID    Item_Aux_name
1001      IT_1        3323           IT_Aux_1
1002      IT_2        3325           IT_Aux_2
1003      IT_3        3328           IT_Aux_3
1010      IT_4        3333           IT_Aux_4

첫 번째 CSV 파일에 새 항목을 생성하고 싶습니다(두 번째 CSV 파일의 항목당 하나의 항목). 각각의 새 항목은 Table1의 첫 번째 행과 동일해야 하며 항목 ID는 적절하게 대체되어야 합니다. 예상되는 출력은 다음과 같습니다.

Table 1
Item ID   Time                  Available   Location 
0001      02/02/2021  08:00     Y           NJ
0001      02/02/2021  09:00     N           UT
0001      02/02/2021  10:00     Y           AZ
0001      02/02/2021  11:00     Y           CA
0002      02/02/2021  08:00     Y           NJ
0002      02/02/2021  09:00     N           UT
0002      02/02/2021  10:00     Y           AZ
0002      02/02/2021  11:00     Y           CA  
1001      02/02/2021  08:00     Y           NJ
1002      02/02/2021  08:00     Y           NJ
1003      02/02/2021  08:00     Y           NJ
1010      02/02/2021  08:00     Y           NJ 

위의 기능을 달성하기 위해 Unix에서 스크립트를 어떻게 작성할 수 있습니까? 미리 감사드립니다.

답변1

논리를 이해하려면 댓글을 읽어보세요.

awk '
NR==2           {SV = $0                # save the relevant info from file1
                 RG = $1
                }
NR != FNR       {if (FNR==1) next       # in new file: skip header
                 sub(RG, $1, SV)        # insert new "item ID" in saved line
                 RG = $1                # save new search pattern
                 sub($0, SV)            # replace input line with modified saved line   
                }
1                                       # print it
' file[12] 
Item ID   Time                  Available   Location 
0001      02/02/2021  08:00     Y           NJ
0001      02/02/2021  09:00     N           UT
0001      02/02/2021  10:00     Y           AZ
0001      02/02/2021  11:00     Y           CA
0002      02/02/2021  08:00     Y           NJ
0002      02/02/2021  09:00     N           UT
0002      02/02/2021  10:00     Y           AZ
0002      02/02/2021  11:00     Y           CA
1001      02/02/2021  08:00     Y           NJ
1002      02/02/2021  08:00     Y           NJ
1003      02/02/2021  08:00     Y           NJ
1010      02/02/2021  08:00     Y           NJ

답변2

가능하면 CSV 인식 도구를 사용하여 CSV 파일을 처리하는 것이 좋습니다. 이 awk 스크립트는 매우 간단한("일반") CSV에 대해 작동하지만 CSV에 따옴표가 있으면 awk에서 구문 분석하는 데 문제가 발생합니다.

GoCSV명령형 코드를 작성하지 않고도 데이터를 효과적으로 제어할 수 있는 많은 명령이 포함된 CSV 인식 도구입니다. 원하는 것을 일련의 단계로 선언합니다(파이프라인 가능).

#!/bin/sh

# Isolate 1st row from table1
gocsv head -n 1 table1.csv > first_row.csv

# Add a shared key to first_row and table2 (in the new column 'Key')
gocsv add -n Key -t '_key_' first_row.csv > first_row_keyed.csv

gocsv add -n Key -t '_key_' table2.csv > table2_keyed.csv

# Left-join first_row to table2, by matching on the shared key (the Key column)
gocsv join -c Key table2_keyed.csv first_row_keyed.csv > table2_joined.csv

# Select (cut) the first 'Item ID' (column 1) and the other 3 fields that were joined from first_row
gocsv select -c 1,'Time','Available','Location' table2_joined.csv > table2_cut.csv

# Stack table1 then new version of table2
gocsv stack table1.csv table2_cut.csv > final.csv

샘플 데이터를 시뮬레이션했습니다.

1 번 테이블

Item ID,Time,Available,Location
0001,02/02/2021  08:00,Y,NJ
0001,02/02/2021  09:00,N,UT
0001,02/02/2021  10:00,Y,AZ
0001,02/02/2021  11:00,Y,CA
0002,02/02/2021  08:00,Y,NJ
0002,02/02/2021  09:00,N,UT
0002,02/02/2021  10:00,Y,AZ
0002,02/02/2021  11:00,Y,CA

표 2

Item ID,Item_Name,Item_Aux_ID,Item_Aux_name
1001,IT_1,3323,IT_Aux_1
1002,IT_2,3325,IT_Aux_2
1003,IT_3,3328,IT_Aux_3
1010,IT_4,3333,IT_Aux_4

이 두 파일에 대해 스크립트를 실행하면 다음과 같은 결과가 나타납니다.최종.csv:

Item ID,Time,Available,Location
0001,02/02/2021  08:00,Y,NJ
0001,02/02/2021  09:00,N,UT
0001,02/02/2021  10:00,Y,AZ
0001,02/02/2021  11:00,Y,CA
0002,02/02/2021  08:00,Y,NJ
0002,02/02/2021  09:00,N,UT
0002,02/02/2021  10:00,Y,AZ
0002,02/02/2021  11:00,Y,CA
1001,02/02/2021  08:00,Y,NJ
1002,02/02/2021  08:00,Y,NJ
1003,02/02/2021  08:00,Y,NJ
1010,02/02/2021  08:00,Y,NJ

관련 정보