我有一個包含不同列的 CSV,其中一列包含電子郵件。該腳本應根據列生成一個字串,并將其作為附加列添加到 CSV。目前腳本貫穿每一行并形成字串。但我想要的是,該腳本只構建具有相同電子郵件地址的行字串。棘手的是,我不知道不同的電子郵件地址,因此我無法對其進行硬編碼并對其進行動態分組。
有什么方法可以構建它?
這是我最初的 CSV:
42342;home;2020-01-12;2020-01-13;test@test.com
45235;home;2020-04-12;2020-04-13;test@test.com
68787;photo;2020-05-12;2020-05-13;[email protected]
68787;test;2020-05-12;2020-05-13;[email protected]
68787;test;2020-05-12;2020-05-13;[email protected]
68787;test;2020-05-12;2020-05-13;[email protected]
CSV 最后應該是什么樣子:
42342;home;2020-01-12;2020-01-13;test@test.com;home 2020-01-12_2020-01-13 && home 2020-04-12_2020-04-13
45235;home;2020-04-12;2020-04-13;test@test.com;home 2020-01-12_2020-01-13 && home 2020-04-12_2020-04-13
68787;photo;2020-05-12;2020-05-13;[email protected];photo 2020-05-12_2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13 && test 2020-05-12_2020-05-13
這是我的 bash 腳本:
getPhotosCommand(){
com=""
header="ID;DIR;START_DATE;END_DATE"
while read line; do
IFS=';' read -r -a array <<< "$line"
dir=${array[2]}
start_date=${array[3]}
end_date=${array[4]}
newCom="$dir $start_date_$end_date && "
com=$com$newCom
done < $file_new_photos
echo $com
}
uj5u.com熱心網友回復:
保持行的原始順序的兩遍 awk 解決方案。第一遍用于構建第 6 個欄位(針對每封電子郵件),第二遍用于將它們附加到相應的行。
awk '
BEGIN {FS = OFS = ";"}
{
if (NR == FNR) {
str = $2 " " $3 " " $4
if (arr[$5]) {
arr[$5] = arr[$5] " && " str
} else {
arr[$5] = str
}
} else {
print $0, arr[$5]
}
}
' file.scsv file.scsv
輸出:
42342;home;2020-01-12;2020-01-13;test@test.com;home 2020-01-12 2020-01-13 && home 2020-04-12 2020-04-13
45235;home;2020-04-12;2020-04-13;test@test.com;home 2020-01-12 2020-01-13 && home 2020-04-12 2020-04-13
68787;photo;2020-05-12;2020-05-13;[email protected];photo 2020-05-12 2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13
68787;test;2020-05-12;2020-05-13;[email protected];test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13 && test 2020-05-12 2020-05-13
uj5u.com熱心網友回復:
為了決議一個檔案并輸出另一個后處理的檔案,我會使用awk。
awk 有關聯陣列(在大多數語言中也稱為映射),它可以幫助您解決問題。
簡而言之,您的 awk 腳本應該:
- 在您的開始塊中:初始化您的關聯陣列,處理一些引數以在結束塊中設定輸出。
- 在您的“行塊”中:在關聯陣列中插入當前行,并以電子郵件為鍵
- 在您的結束塊中:生成回圈關聯陣列的新檔案。
玩得開心 =)
uj5u.com熱心網友回復:
假設這些行按電子郵件地址分組并且檔案沒有空行,則此bash腳本可能是您正在嘗試執行的操作。
#!/bin/bash
cnt=0
while IFS= read -r line; do
email=${line##*;}
if [ "$email" = "$prev_email" ]; then
grpline[cnt ]=$line
else
if ((cnt)); then
tail=
for ((i = 0; i < cnt; i)); do
IFS=';' read -ra fld <<< "${grpline[i]}"
tail =" && ${fld[1]} ${fld[2]}_${fld[3]}"
done
tail=${tail:4}
for ((i = 0; i < cnt; i)); do
printf '%s;%s\n' "${grpline[i]}" "$tail"
done
fi
prev_email=$email
grpline[0]=$line
cnt=1
fi
done < <(cat file; echo)
如果檔案未按電子郵件地址分組,則將 替換cat file為sort -t \; -k5 file.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413734.html
標籤:
