我有兩個檔案。
file1.txt 包含:
META GAIN CORP
GG$
ABG$
PEPRA_UAT
12GHR
CC$
USDP_MAIN
XQ$
PR$
MIX_DEV
和 file2.csv 包含:
\\fr.usdp.org\SOLE\Home\RD,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\99 FLOOR,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\44 FLOOR,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\META GAIN CORP,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\META GAIN CORP,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\META GAIN CORP,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\META GAIN CORP,[email protected]
\\fr.usdp.org\SOLE\Shares\FR\USDP WATER\ABG$,[email protected]
\\fr.usdp.org\SOLE\Shares\FR\USDP WATER\ABG$,[email protected]
\\fr.usdp.org\SOLE\Shares\FR\USDP WATER\ABG$,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\HHR DATABASE,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\HHR DB2 EDU,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\HHR DB2 EDU,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\NICE SHORT,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\PRO DEV,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\DUK 20154 USER,
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\DUK 20154 USER,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\FARE GRUST,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\XYZ GROUP,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\XYZ TEAM TOOLKIT,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\BILLING ELEMENT,[email protected]
\\fr.usdp.org\SOLE\SHARES\FR\USDP WATER\RRT_SEC,[email protected]
我的腳本上有這個,但如果有空格,我不能完全得到最后一列。
for sr in `cat file1.txt`; do
sname=`echo ${sr} | awk -F: '{ print $1 }'`
emdrs=`grep -Fw "${sname}" file2.csv | awk -F',' '{print$2}' | sed 's/[[:space:]]//' | xargs | sed -e 's/ /,/g'`
echo "$sname || To: $emdrs" >> details.txt
done
details.txt 輸出
META || [email protected],[email protected],[email protected],[email protected]
GAIN || [email protected],[email protected],[email protected],[email protected]
CORP || [email protected],[email protected],[email protected],[email protected]
但我想要的是
META GAIN CORP || To: [email protected],[email protected],[email protected],[email protected]
我也應該能夠像這樣一個 ABG$ 使用 $ 搜索字串,并且不包括重復的電子郵件。
ABG$ || To: [email protected],[email protected]
任何幫助將不勝感激。
uj5u.com熱心網友回復:
像這樣的東西?
while read -r sr; do
emails="$(grep -F "\\${sr}," file2.csv | cut -d',' -f2 | sort -u | tr -d '\r' | paste -sd',')"
if [ -n "$emails" ]; then
echo "$sr || To: $emails"
fi
done < file1.txt
一些解釋:
grep -F- 將模式 ($sr) 視為固定字串而不是正則運算式,以避免$匹配行尾cut -d',' -f2- 把結果用逗號刪掉,只輸出第二部分sort -u- 洗掉重復項tr -d '\r'- 洗掉回車paste -sd','- 用逗號連接行if [ -n "$emails" ]$emails不為空時才輸出
uj5u.com熱心網友回復:
一個awk想法(替換 OP 的當前for回圈):
awk -F',|\\\' ' # field delimiter of "," or "\"
FNR==NR { srlist[$1]
next
}
{ email=$NF
if (email == "") next
sr=$(NF-1)
if (sr in srlist && emlist[sr] !~ email) { # skip duplicate email addresses
delim=(emlist[sr]) ? "," : ""
emlist[sr]=emlist[sr] delim email
}
}
END { for (sr in emlist)
print sr " || To: " emlist[sr]
}
' file1.txt file2.csv
這會產生:
ABG$ || To: [email protected],[email protected]
META GAIN CORP || To: [email protected],[email protected],[email protected],[email protected]
筆記:
- 雖然比 OP 的當前
for回圈鍵入更多,但這種方法需要一次掃描file2.awk并消除 7 個子行程呼叫(每次通過 OP 的for回圈) - 對于任何可觀的資料量,
awk解決方案應該明顯更快 - 對于提供的樣本資料:
- 0.65 秒:
awk - 1.80 秒:
bash/for-loop
- 0.65 秒:
uj5u.com熱心網友回復:
shell 回圈永遠不是處理文本的正確方法,請參閱why-is-using-a-shell-loop-to-process-text-considered-bad-practice。
對陣列陣列使用 GNU awk:
$ cat tst.awk
BEGIN { FS="[\\\\,]" }
NR == FNR {
tgts[$0]
next
}
{
sr = $(NF-1)
email = $NF
}
(sr in tgts) && (email != "") {
emails[sr][email]
}
END {
for ( sr in emails ) {
printf "%s || To:", sr
sep = " "
for ( email in emails[sr] ) {
printf "%s%s", sep, email
sep = ","
}
print ""
}
}
$ awk -f tst.awk file1.txt file2.csv
ABG$ || To: [email protected],[email protected]
META GAIN CORP || To: [email protected],[email protected],[email protected],[email protected]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/424726.html
下一篇:根據條件在bash中多次列印字串
