여러 파일을 소싱하고 하나의 파일을 출력합니다.

여러 파일을 소싱하고 하나의 파일을 출력합니다.

다음 변수를 포함하는 "conf1"이라는 파일이 있습니다.

name='john'
last=''
custom='1000'

다른 파일의 이름은 conf2이며 다음과 같습니다.

name='john'
last='star'

하나의 파일로 병합하고 싶지만 병합된 파일에는 가져온 것과 동일한 순서로 변수가 포함되어 있습니다.

예를 들어, conf1을 먼저 얻은 다음 conf2를 얻으면 conf 2의 변수가 conf1을 덮어씁니다. 하지만 conf2에 없는 변수도 있을 것입니다.

고유하고 마지막 소스인 변수만 포함하는 1개의 파일을 병합하여 생성하고 싶습니다.

원하는 출력: conf3

name='john'
last='star'
custom='1000'

가능합니까?

답변1

다음을 수행할 수 있습니다.

$ awk -F= '{l[$1]=$0};END{for (i in l) print l[i]}' conf1 conf2
custom='1000'
last='star'
name='john'

출력에서 행의 순서는 보장되지 않지만( awk배열이 해시 테이블에 내부적으로 저장되는 방식에 따라) 의 설정이 의 설정 conf2보다 우선합니다 conf1.

어디

  • awk -F= ... conf1 conf2=conf 파일에서 구분 기호로 awk를 호출합니다.
  • {l[$1]=$0}각 변수의 정의를 저장합니다. 최신 변수가 가장 오래된 변수를 덮어씁니다.
  • END{ ... }마지막으로 (모든 파일을 처리한 후)
  • for (i in l)모든 변수를 반복합니다.
  • print l[i]그리고 인쇄하세요.

답변2

펄 방법:

$ perl -F= -lane '$k{$F[0]}=$F[1]; END{print "$_=$k{$_}" for keys(%k)}' conf1 conf2 
last='star'
name='john'
custom='1000'

이것은 Stéphane의 답변과 동일한 답변입니다. 변수 이름이 키이고 해당 값이 값인 해시를 작성합니다. 그런 다음 모든 파일을 처리한 후 키/값 쌍을 인쇄합니다. 행의 순서는 보장되지 않으며 호출 간에 변경될 수 있지만 값은 conf2항상 값보다 우선합니다 conf1.

답변3

우선순위를 얻으 려면 매개변수 앞에 conf2와야 합니다 . conf1sort

sort -suk1,1 -t= conf2 conf1 | tac

산출:

name='john'
last='star'
custom='1000'

위의 내용은 레이블에 의존하며 custom원하는 출력 순서에 따라 last적절 하게 정렬됩니다. name그러나 이 패턴은 레이블 이름이 다른 방식으로 지정될 때 작동합니다.

eval srx=\" 's/^'{name/1,last/2,custom/3}'=&/;' \"   # sort seq: 1,2,3,etc
sort -suk1,1 -t= conf2 conf1 | sed "$srx" | sort -n | cut -d= -f2-    

답변4

이것을 사용하십시오 :

name=${name:-John}
last=${last:-}
custom=${custom:-1000}

...다른 파일에도 마찬가지입니다. 쉘의 매뉴얼 페이지를 읽으십시오. 변수가 이미 설정되어 있고 null이 아닌 경우 변수를 지정된 값으로 설정합니다. 파일을 얻는 순서에 관계없이 적어도 표시되는 예제 데이터의 경우에는 중요하지 않습니다.

관련 정보