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

时间:2020-10-21 17:39:24

标签: bash csv awk grep txt

我有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的Columns(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

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

1 个答案:

答案 0 :(得分:1)

可以使用Maube,

awk '{print $4, $5, $6 > "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 $0 > "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;然后,我们删除所有已创建的临时文件;
相关问题