2014-07-22 121 views
1

我有2個文件。其中包含需要創建的文件名列表和其他文件包含文件的名稱和含量(製表符分隔),我需要把它象下面這樣:在Shell中使用FOR循環創建多個文件

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; 

現在我需要創建文件爲AAA。 txt文件(如文件1)並放入文件2中的相應內容。請注意,文件2中每個文件的行號可能會有所不同,但會按文件名進行分組。

感謝

+0

我試圖理解你的代碼。文件1中的代碼看起來很可疑。我不知道使用該語法的任何語言。我會假設這是輸入。 File 2中的代碼看起來像'sql'語句,但select語句之前的代碼讓我失望。請重新格式化您的代碼,我將調試您的代碼併發布回覆。 – alvits

+0

嗨@alvits,文件1包含所有帶.sh擴展名(而不是.txt)的文件名,文件2一定會有文件1中給出的所有文件名的條目。其實我錯過了BBB的條目。 – Vetri

回答

1

這裏是標準(POSIX)外殼的一種方法:

xargs touch < "File 1" 
while read filename line; do 
    printf "%s\n" "$line" >> $filename 
done < "File 2" 
+0

第一個文件對於創建「丟失」文件很有用,比如BBB.txt。在while循環之前,你可以'xargs touch

+0

@glennjackman謝謝,我錯過了。固定。 – jlliagre

+0

@jlliagre ..它的工作正常。非常感謝您的幫助 – Vetri

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 
+0

更好的希望內容不包含雙重空格。 –

+0

@glennjackman哦,是的,我感謝你。 – konsolebox