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ファイルに新しいエントリを作成したい(2番目のCSVファイルのエントリごとに1つのエントリ)。各新しい項目は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

おすすめ記事