如何在 CSV 文件中附加新行并在 Unix 中修改它们

How can I append new lines in a CSV file and modify them in Unix

我是 Unix 的新手,开始学习 shell 脚本。我正在使用包含以下示例行的 CSV 文件(这是一个大型 CSV 文件,每个项目有 4 个条目):

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      

我有另一个 CSV,其中包含一堆项目 ID,如下所示:

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 中编写脚本来实现上述功能?提前致谢。

一个awk想法:

awk '
NR==3 { # 1st file: skip 1st two lines (the header rows) then ...

        copyline=[=10=]            # make a copy of the 3rd line and ...
        nextfile               # skip to the next file
      }

FNR>2 { # 2nd file: skip 1st two lines (the header rows) and ...
        # replace the 1st field of variable "copyline" with 1st field of current input line and ...
        # print the modified "copyline" to stdout
                                
        print gensub(/^[^[:space:]]*/,,1,copyline)
      }
' file1.csv file2.csv

删除评论:

awk '
NR==3 { copyline=[=11=]; nextfile }
FNR>2 { print gensub(/^[^[:space:]]*/,,1,copyline) }
' file1.csv file2.csv

进一步折叠成一条线:

awk 'NR==3{copyline=[=12=];nextfile}FNR>2{print gensub(/^[^[:space:]]*/,,1,copyline)}' file1.csv file2.csv

这会生成:

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

一旦 OP 对输出感到满意,并假设希望将输出附加到第一个文件,那么...

# change this:

' file1.csv file2.csv

# to this:

' file1.csv file2.csv >> file1.csv