使用awk
:
awk -F' ' 'NR == FNR { a[$1] = a[$1] $2 ORS } { t = $0; sub(/[[:blank:]]+$/, "", t) } t in a { printf "%s", a[t] > t }' file2 file1
或更安全,即使數據(在第二列)具有雙重空間:
awk 'BEGIN { FS = OFS = " " } NR == FNR { t = $1; $1 = ""; sub(/^[[:blank:]]+/, ""); a[t] = a[t] $0 ORS } { t = $0; sub(/[[:blank:]]+$/, "", t) } t in a { printf "%s", a[t] > t }' file2 file1
而且使用bash
:
#!/bin/bash
FILE1=$1
FILE2=$2
[ -n "$BASH_VERSION" ] && [[ BASH_VERSINFO -ge 4 ]] || exit 1
shopt -s extglob
declare -A MAP=()
declare -A FLAGS=()
IFS=$' \t\n' ## Use normal IFS.
while read -r LINE; do
NAME=${LINE%% *}
DATA=${LINE#* }
MAP[$NAME]=${MAP[$NAME]}$DATA$'\n'
done < "$FILE2"
while read -r NAME; do
((! FLAGS[$NAME]++)) && : > "$NAME"
echo -n "${MAP[$NAME]}" >> "$NAME"
done < "$FILE1"
用法:
bash script.sh file1 file2
我試圖理解你的代碼。文件1中的代碼看起來很可疑。我不知道使用該語法的任何語言。我會假設這是輸入。 File 2中的代碼看起來像'sql'語句,但select語句之前的代碼讓我失望。請重新格式化您的代碼,我將調試您的代碼併發布回覆。 – alvits
嗨@alvits,文件1包含所有帶.sh擴展名(而不是.txt)的文件名,文件2一定會有文件1中給出的所有文件名的條目。其實我錯過了BBB的條目。 – Vetri