如何在 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
我是 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