我有2个文件。一个包含需要创建的文件名列表,其他文件包含文件名和内容(由选项卡分隔),我需要将其放在下面:
File 1:
AAA.txt
BBB.txt
CCC.txt
DDD.txt
File 2:
AAA.txt Select * from abc;
AAA.txt Delete from abc;
CCC.txt select * from xyz;
DDD.txt select * from efg;
现在我需要创建File作为AAA.txt(如文件1中所示)并放置文件2中的相应内容。请注意文件2中每个文件的行数可能会有所不同但它将是按文件名分组。
由于
答案 0 :(得分:1)
这是标准(POSIX)shell中的一种方式:
xargs touch < "File 1"
while read filename line; do
printf "%s\n" "$line" >> $filename
done < "File 2"
答案 1 :(得分:0)
使用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