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

考希克

data.csv 中的内容

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

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 语句”以在打印第二列之前检查两个文件中第一列中用户的电子邮件 ID 是否相等. 我只想通过映射电子邮件 ID 来打印 unique_user_id 和状态 我可以这样做吗?或者我可以用 awk 命令做得更好吗?最好的方法是什么?谢谢

网卡3500

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

#!/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 中。如果不是,什么也不做(没有elseif)。但是,如果您无论如何都想做某事,请添加一个else和一些代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档