첫 번째 파일의 헤더만 유지하면서 동일한 구조의 파일을 연결합니다.

첫 번째 파일의 헤더만 유지하면서 동일한 구조의 파일을 연결합니다.

다음 스크립트를 사용하여 이름이 다르고 데이터 구조가 동일한 28개의 파일을 병합하고 싶습니다.

$ cp mohan.csv Consolidate.csv
$ for fname in line
    do 
      cat $fname | sed '1d' >> Consolidate.csv
    done < input.txt

그리고 input.txt다음을 포함합니다:

mohan.csv
babu.csv
mahesh.csv
datvik.csk
... etc

그리고

$ cat mohan.csv
no,name,dept
1,xyz,hr
2,abc,sales

내 스크립트의 출력:

$ cat Consolidate.csv
no,name,dept
1,xyz,hr
2,abc,sales
babu.csv
mahesh.csv
datvik.csk
... etc

이 문제에 대해 도와주세요.

답변1

다양한 도구를 사용하여 작업을 완료할 수 있습니다. 첫 번째 헤더를 유지하고 다른 헤더를 제거하고 싶다고 가정합니다. 따라서 다른 파일의 헤더를 제거하면서 변경되지 않은 첫 번째 파일에 추가하면 됩니다.

제거하다 :mohan.csvinput.txt

$ cat input.txt
babu.csv
mahesh.csv
datvik.csk
... etc

그 다음에:

$ cp mohan.csv consolidate.csv
$ for file in "$(<input.txt)"; do
    sed '/no,name,dept/d' "$file" >> consolidate.csv
  done

또는 다음을 사용하여 read:

$ cp mohan.csv consolidate.csv
$ while read -r file; do
    sed '/no,name,dept/d' "$file" >> consolidate.csv
  done <  input.txt

또는 더 간단하게는 다음 sed에서 순수한 답을 찾을 수 있습니다.https://unix.stackexchange.com/a/204343/72707

답변2

어때요?

awk 'NR==1 || FNR > 1' $(< input.txt )

awk명령줄에서 파일 이름 목록 (LINE_MAX 시스템 구성 매개변수까지) 을 생성하도록 "명령 대체"를 인용하지 마십시오 . 파일 이름에 공백 문자가 포함되어 있으면 배열로 되돌립니다.

readarray -t Arr < input.txt
awk 'NR==1 || FNR > 1' "${Arr[@]}"

제목이 여러 줄에 걸쳐 있는 경우 스크립트에서 비교하려는 두 숫자를 조정하세요 awk.

답변3

이 솔루션은 파일 목록이 일부 외부 명령에 대한 단일 호출이 처리할 수 있는 것보다 길 수 있다고 가정합니다(따라서 input.txt파일 이름을 명령줄에 한 번에 나열할 수 없음).

위치 매개변수 목록(예: 일부 스크립트의 매개변수 목록)에 연결하려는 파일의 경로 이름 목록이 포함되어 있고 출력 파일이 아직 존재하지 않는 경우 그 중 첫 번째 파일의 헤더만 가져오려고 한다고 가정합니다. . 출력 파일이 이미 존재하는 경우 헤더가 이미 출력에 기록되었다고 가정할 수 있습니다.

쉘에서 이 작업을 수행하는 최소 코드는 다음과 같습니다.

[ ! -e outfile ] && head -n 1 -- "$1" >outfile
awk 'FNR != 1' "$@" >>outfile

여기서는 파일이 아직 존재하지 않는 경우 head -n 1첫 번째 파일에서만 헤더를 가져와서 에 쓰는 데 사용됩니다 . 그런 다음 모든 파일에서 첫 번째 줄을 제외한 모든 줄을 추출하고 해당 줄을 .outfileoutfileawkoutfile

이 작은 스크립트는 파일 이름이 적절하게 인용되어 있거나 그렇지 않으면 "단순"(공백 문자나 인용문이 포함되지 않음) input.txt이라고 가정하고 파일의 모든 입력 파일에 대해 실행될 수 있습니다 .input.txt

xargs sh -c '
    out=$1; shift
    [ ! -e "$out" ] && head -n 1 -- "$1" >"$out"
    awk "FNR != 1" "$@" >>"$out"
' sh Consolidate.csv <input.txt

이는 입력을 매개변수로 사용하는 xargs작은 인라인 스크립트를 실행하는 데 사용됩니다 . 출력 파일 이름은 첫 번째 인수로 제공되며 인라인 스크립트로 수신됩니다 .sh -cinput.txtConsolidate.csvout

목록이 input.txt길면 xargs인라인 스크립트가 여러 번 호출되도록 예약되고 배치 매개변수가 파일에서 읽혀집니다.

관련 정보