다음 스크립트를 사용하여 이름이 다르고 데이터 구조가 동일한 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.csv
input.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
첫 번째 파일에서만 헤더를 가져와서 에 쓰는 데 사용됩니다 . 그런 다음 모든 파일에서 첫 번째 줄을 제외한 모든 줄을 추출하고 해당 줄을 .outfile
outfile
awk
outfile
이 작은 스크립트는 파일 이름이 적절하게 인용되어 있거나 그렇지 않으면 "단순"(공백 문자나 인용문이 포함되지 않음) 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 -c
input.txt
Consolidate.csv
out
목록이 input.txt
길면 xargs
인라인 스크립트가 여러 번 호출되도록 예약되고 배치 매개변수가 파일에서 읽혀집니다.