我想在while循环中添加If条件以检查2个文件中每行中的相同字符串,如果匹配则打印文件中的其他列

问题描述 投票:0回答:1

Contents in data.csv

[email protected] status
[email protected] status
[email protected] status 

Contents in data2.csv

[email protected] unique_user_id
[email protected] unique_user_id
[email protected] unique_user_id

我的示例代码:

While read c1.f1 c2.f1 c1.f2 c2.f2;
Do 
Echo “$c2.f2 $c2.f1”
Done<paste data.csv data2.csv

这段代码会打印出两个文件的第二列中的值,但我需要在此之前进行某种验证,例如添加“if statement”以检查在打印第二列之前两个文件中第一列中用户的电子邮件ID是否相等。我想通过映射电子邮件ID来打印unique_user_id和状态我可以这样做吗?或者我可以使用awk命令更好地做到这一点,最好的方法是什么?谢谢

bash
1个回答
0
投票

这是我想出的一个快速脚本:

#!/bin/bash

# using your method
paste data.csv data2.csv | while read file1_email file1_value file2_email file2_value
do
    if [ "$file1_email" == "$file2_email" ]
    then
        echo "$file1_email, $file1_value, $file2_value"
    fi
done

echo "------------------------------------------"

# this is mine
while read file1_email file1_value
do
    file2_counter=$(grep -c $file1_email data2.csv)
    if [ $file2_counter -gt 0 ]
    then
        file2_line=$(grep $file1_email data2.csv)
        file2_value=$(echo $file2_line | awk '{print $2}')

        echo "$file1_email, $file1_value, $file2_value"
    fi
done <data.csv
  • 你的方法存在的问题是,地址电子邮件总是出现在两个文件的相同行中。
  • 恩。如果data2.csv应用了不同的排序,则它可以具有与data2.csv中相同的所有电子邮件地址。但paste命令不会对任何内容进行排序,只是在读取数据时显示数据。
  • 这就是为什么我想出了一个不同的方法。从data.csv中读取电子邮件地址,在data2.csv中搜索(如果有),如果是,则从中提取值,然后打印所有数据。

如果你使用我的方法,它将循环遍历data.csv的每一行。但是data.csv必须是“干净的”,因为read假设2个字段。第一个是电子邮件,第二个是价值。您应该查看data.csv内容。

然后,在一段时间内,它会检查从data.csv读取的电子邮件是否存在于data2.csv中。如果不是,没有做任何事情(else没有if)。但是如果你想要做任何事情,添加一个else和一些代码。

© www.soinside.com 2019 - 2024. All rights reserved.