我有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
当前上述脚本未将匹配结果写入文件。
我的代码有什么问题?
5条答案
按热度按时间wz8daaqr1#
参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice。
给定此输入:
这似乎是你正在尝试做的(使用任何awk):
x一个一个一个一个x一个一个二个一个x一个一个三个一个
管道到上面的
awk
脚本和@Frvadona的grep解决方案之间的主要区别是,如果目标电子邮件地址出现在输入的其他字段中,它不会产生错误匹配,并且它会在每个Unix机器上工作。而不仅仅是那些具有支持-w
的grep的应用程序如果users.txt
包含一个空行,这个脚本也会继续工作,而到grep的管道会打印所有输入行。考虑到你提到的在看起来应该得到输出的时候没有得到输出,在你的电子邮件列表中的行的末尾可能有白色和/或carriage returns,这就是为什么我用
$1
而不是$0
填充数组,并有一个sub()
删除终止CR(如果存在)。我并不是建议您将
command_to_get_match_user
重新定义为我所展示的内容-我只是需要一些定义来测试它。cgfeq70w2#
您可能会得到一些误报,但考虑到模式和输入文件,它应该足够准确:
注意:
grep -w
不是标准配置,但得到广泛支持:GNU,BSD,Solaris(non-POSIX),AIX,HP-UX,etc...yrwegjxp3#
users.txt输出
从command_to_get_match_user进行或运算
chy5wohz4#
使用
sed
从command_to_get_match_user
中提取电子邮件地址,使用grep
过滤users.txt
:使用GNU
sed
:a64a0gku5#
这不是最干净的解决方案,但它的工作
之前你说你想要输出为csv,但是看起来你编辑了你的文章来删除它。编辑代码来得到你想要的任何格式的输出应该很容易