shell 匹配结果未写入文件

mctunoxg  于 2023-03-24  发布在  Shell
关注(0)|答案(5)|浏览(152)

我有users.txt作为输入文件如下格式。

rajesh.kumar@company.com
rhmn@company.com
mkkumar@company.com
manish.panday@company.com
daniel.m@company.com
jain@company.com
abul@company.com
aditi@company.com
aditya.s@company.com

下面的脚本逐行读取users.txt文件,并只将匹配的用户邮件地址沿着行写入csv文件。

#!/bin/bash

Input_file="users.txt"
Output_file="result.csv"
Match_list="$(command_to_get_match_user)"
Email="$(echo "$Match_list" | awk -F '|' '{print $4}' | tr -d '[:space:]')"

while read line; do
  if [[ "$line" == *"$Email"* ]]; then
    echo "$line" >> "$Output_file"
  fi
done < "$Input_file"

上面脚本中的命令Match_list=在运行时提供了以下输出。

1320 | | Rajesh Kumar | rajesh.kumar@company.com | live
1584 | | A.K.M. Rahman | rhmn@company.com | live
1503 | | Mukesh Kumar | mkkumar@company.com | live
1279 | | Aayush Jain | aayush.jain@company.com | live
1597 | | Abul Hasan Md Osama | abul.osama@company.com | live
1660 | | Aditi Singpuri | aditi.singpuri@company.com | live
1570 | | Aditya Jain | aditya.jain@company.com | live

当前上述脚本未将匹配结果写入文件。
我的代码有什么问题?

wz8daaqr

wz8daaqr1#

参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice
给定此输入:

$ head -100 users.txt data.txt
==> users.txt <==
rajesh.kumar@company.com
rhmn@company.com
mkkumar@company.com
manish.panday@company.com
daniel.m@company.com
jain@company.com
abul@company.com
aditi@company.com
aditya.s@company.com

==> data.txt <==
1320 | | Rajesh Kumar | rajesh.kumar@company.com | live
1584 | | A.K.M. Rahman | rhmn@company.com | live
1503 | | Mukesh Kumar | mkkumar@company.com | live
1279 | | Aayush Jain | aayush.jain@company.com | live
1597 | | Abul Hasan Md Osama | abul.osama@company.com | live
1660 | | Aditi Singpuri | aditi.singpuri@company.com | live
1570 | | Aditya Jain | aditya.jain@company.com | live

这似乎是你正在尝试做的(使用任何awk):
x一个一个一个一个x一个一个二个一个x一个一个三个一个
管道到上面的awk脚本和@Frvadona的grep解决方案之间的主要区别是,如果目标电子邮件地址出现在输入的其他字段中,它不会产生错误匹配,并且它会在每个Unix机器上工作。而不仅仅是那些具有支持-w的grep的应用程序如果users.txt包含一个空行,这个脚本也会继续工作,而到grep的管道会打印所有输入行。
考虑到你提到的在看起来应该得到输出的时候没有得到输出,在你的电子邮件列表中的行的末尾可能有白色和/或carriage returns,这就是为什么我用$1而不是$0填充数组,并有一个sub()删除终止CR(如果存在)。
我并不是建议您将command_to_get_match_user重新定义为我所展示的内容-我只是需要一些定义来测试它。

cgfeq70w

cgfeq70w2#

您可能会得到一些误报,但考虑到模式和输入文件,它应该足够准确:

command_to_get_match_user | grep -wFf users.txt > result.csv

注意:grep -w不是标准配置,但得到广泛支持:GNU,BSD,Solaris(non-POSIX),AIX,HP-UX,etc...

yrwegjxp

yrwegjxp3#

command_to_get_match_user(){
cat << EOF
1320 | | Rajesh Kumar | rajesh.kumar@company.com | live
1584 | | A.K.M. Rahman | rhmn@company.com | live
1503 | | Mukesh Kumar | mkkumar@company.com | live
1279 | | Aayush Jain | aayush.jain@company.com | live
1597 | | Abul Hasan Md Osama | abul.osama@company.com | live
1660 | | Aditi Singpuri | aditi.singpuri@company.com | live
1570 | | Aditya Jain | aditya.jain@company.com | live
EOF
}

users.txt输出

awk -F'|' '
    NR==FNR{
        gsub(/^ *| *$/,"",$4)
        map[$4]
        next
    }
    ($0 in map)
' <(command_to_get_match_user) users.txt

rajesh.kumar@company.com
rhmn@company.com
mkkumar@company.com

从command_to_get_match_user进行或运算

awk -F' *[|] * ' '
    NR==FNR{
        map[$0]
        next
    }
    ($4 in map)
'  users.txt <(command_to_get_match_user)

1320 | | Rajesh Kumar | rajesh.kumar@company.com | live
1584 | | A.K.M. Rahman | rhmn@company.com | live
1503 | | Mukesh Kumar | mkkumar@company.com | live
chy5wohz

chy5wohz4#

使用sedcommand_to_get_match_user中提取电子邮件地址,使用grep过滤users.txt

$ grep -Ff <(command_to_get_match_user |
sed -E 's/[[:space:]]*//g;s/^([^|]*\|){3}([^|]*).*/\2/') "$Input_file" > "$Output_file"

$ cat "$Output_file"
rajesh.kumar@company.com
rhmn@company.com
mkkumar@company.com

使用GNU sed

$ grep -Ff <(command_to_get_match_user |
sed -E 's/\s*//g;s/^([^|]*\|){3}([^|]*).*/\2/') "$Input_file" > "$Output_file"
a64a0gku

a64a0gku5#

这不是最干净的解决方案,但它的工作

#!/bin/bash

Input_file="users.txt"
Output_file="result.csv"

while read line; do
   echo "$(command_to_get_match_user)" | grep $line | awk 'BEGIN { FS = "|" } ; {print $1,$3,$4}' | sed 's/   /,/g' >> $Output_file
done < $Input_file

之前你说你想要输出为csv,但是看起来你编辑了你的文章来删除它。编辑代码来得到你想要的任何格式的输出应该很容易

相关问题