在Shell中使用FOR循环创建多个文件

时间:2014-07-22 01:19:37

标签: shell

我有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中每个文件的行数可能会有所不同但它将是按文件名分组。

由于

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