2014-07-22 4 views
1

2 개의 파일이 있습니다. 하나는 파일 이름의 목록을 작성해야합니다 포함하고 다른 파일은 내가 아래처럼 둘 필요가 파일 이름과 (탭으로 구분) 내용 포함 :쉘에서 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의 코드가 의심스러워 보입니다. 이 구문을 사용하여 알고있는 언어가 없습니다. 그게 입력이라고 가정합니다. 파일 2의 코드는'sql' 문과 비슷하지만 select 문 앞에있는 코드는 나를 망쳤습니다. 코드를 다시 포맷하십시오. 그러면 코드를 디버그하고 응답을 게시합니다. – alvits

+0

안녕하세요 @ alvits, 파일 1은 .txt 대신 .sh 확장명을 가진 모든 파일 이름을 포함하고 파일 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

관련 문제