使用 Bash 在 csv 文件中搜索列,在 txt 文件中找到它,然后如果找到,将第 1 列和第 2 列从第一个 csv 输出到第二个 csv

Using Bash to Search Column in a csv file, find it in a txt file, then if found, output Column 1 and 2 from first csv to second csv

我有 2 个 .csv 文件和 1 个 txt 文件。 fileA.csv 有这样的信息:

Column1             Column2

Row1 Column1 Info   Row1 Column2 Data 1 xyz
Row2 Column1 Info   Row2 Column2 Data
Row3 Column1 Info   Row3 Column2 More Data 2 XYZ ABC

编辑:这是一个 csv,所以当在终端中搜索时,列用逗号分隔。

fileB.txt 只是一个通用的 .txt 文件,包含这样的信息


Row1 Column2 Info = XYZ

Row3 Column2 Info = ABC 

我想做的是在 fileB.txt 中搜索 fileA.csv 的第 2 列的每一行。然后,如果找到匹配项,则将 fileA.csv 的列(1 和 2)输出到 fileC.csv 的第 1 列,或者如果语法上更简单,则分别输出第 1 列和第 2 列

使用上面的测试信息到 fileC.csv 的所需输出将是

Column1


Row1 Column1 Info Row1   Column2 Info = XYZ

Row3 Column1 Info Row3   Column2 Info = ABC 

或者如果它在语法上更简单

Column1                   Column2

Row1 Column1 Info Row1    Row1 Column2 Info = XYZ

Row3 Column1 Info Row3    Row3 Column2 Info = ABC 

我试过使用 awk 和 grep,但我不太熟悉 Bash 脚本来从 fileA 中的特定列搜索信息,搜索 txt 文件,然后将 fileA 中的两列输出到fileC.csv

顺便说一句,这不是家庭作业:)

Maube 这行得通:

awk '{print , ,  > "test-fileA"}' fileA.csv;
grep -o -Ff test-fileA fileB.txt > test-fileB; 
grep -n -Ff test-fileB test-fileA | cut -f1 | xargs echo > test-fileC;
awk 'NR==FNR { for (i=1; i<=NF; i++) a[$i] = $i; next } (FNR in a) {print [=10=] > "fileC.csv" }' test-fileC fileA.csv; rm test-file* 
  1. Column2 的第一行打印结果到临时文件'test-fileA'以便我们稍后使用
  2. 我们将'test-fileA'与fileB.txt进行比较,并将结果截取为test-fileB;
  3. 然后我们比较我们创建的文件以获得最后一条命令使用哪一行的结果;我们需要将结果行从 fileA.csv 打印到 fileC.csv
  4. 我们得到比较在 AWK 中匹配的行的结果并将其打印到 fileC.csv;然后我们删除所有创建的临时文件;