분할된 CSV 파일 목록이 있습니다. 첫 번째 CSV 헤더를 나머지 CSV 파일에 복사하는 방법은 무엇입니까?
profiles00.csv profiles01.csv profiles02.csv profiles03.csv ...
이것이 지금 가지고 있는 것인데 출력을 새 파일로 보내거나 기존 파일을 바꾸려면 어떻게 해야 합니까?
find . -name \*.csv -print0 | xargs -0 -I {} -P 100 sed -e '1r {}' -e 'q' profiles00.csv
답변1
특정 문제를 처리하는 한 가지 방법은 다음과 같습니다.
find . -maxdepth 1 -type f -name "profiles*.csv" ! -name "profiles00.csv" -exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +
다음과 같이 여러 줄로 작성됩니다.
find . -maxdepth 1 \
-type f \
-name "profiles*.csv" ! -name "profiles00.csv" \
-exec sed -i -e '1!b' \
-e 'R profiles00.csv' \
-e 'N' \
{} +
읽다:찾다공공 유틸리티는 다음과 같습니다
-maxdepth 1
=> 현재 디렉토리에서만 이동하며 일반적으로 가장 낮은 계층 구조까지 반복됩니다.-type f
=> 보행 시에는 일반 파일만 선택하세요.-name "profiles*.csv" ! -name "profiles00.csv"
=> 모든 일반 파일 중에서 기본 이름이 프로필*.csv인 파일만 선택하고 "profiles00.csv" 파일은 헤더 파일이므로 필터링합니다.-exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +
-i
옵션 => GNU sed 가정에서 파일 편집-e
옵션 => sed 코드는 다음과 같습니다1!b
=> 첫 번째 줄이 아닌 줄은 건드리지 마세요.R profiles00.csv
=>profile00.csv 파일에서 한 줄을 읽습니다. (처음이므로 첫 번째 줄이 됩니다.) 따라서 기본적으로 헤더는 profile00.csv 파일에서 추출됩니다. 하지만 아직 인쇄되지 않았습니다.N
=> 다음 줄을 패턴 공간으로 읽어옵니다. 이는 읽기 버퍼를 플러시한 다음 sed가 작동 중인 현재 파일에서 실제 패턴 공간을 플러시합니다(라인 1,2).
{} +
할 것찾다선택한 여러 파일을sed
한 번에 유틸리티 에 제공하고GNU sed이 옵션을 사용하여-i
여러 파일을 처리하는 기능. 특히, 새 파일을 읽어오면 줄 번호가 재설정됩니다.
≠================ Posix 방식======
LC_ALL=C \
find . ! -name . -prune -type f \
-name 'profiles??*.csv' \
! -name 'profiles*[!0-9]*.csv' \
! -name 'profiles00.csv' \
-exec sh -c '
shift "$1"
head -n 1 < profiles00.csv > header
for arg do
printf "0r header\\nw\\nq\\n" | ed -s "$arg"
done
' 2 1 {} +
여기서 우리는 sed를 버리고 ed에 의지합니다.
- 0r=> 언급된 파일의 내용을 ed가 편집 중인 파일의 시작 부분에 삽입합니다.
- 승=> 파일에 기록하고 모든 변경 사항을 동결합니다.
- 큐=> ed 편집기를 종료합니다.
답변2
xargs가 필요하지 않습니다
주문하다:
find . -maxdepth 1 ! -name "profiles00.csv" -a -name "*csv" -exec sed -i "1s/^/$(head -1 profiles00.csv)\n/" {} \;
find
여기서는 파일을 선택하고 sed
그 자리에서 편집하는 데 사용합니다.
설명하다
find
maxdepth 1
- 하위 디렉터리의 파일이 아닌 직접 디렉터리의 파일만 선택합니다. 하위 디렉터리의 파일도 편집하려면 이 옵션을 제거할 수 있습니다.! -name "profiles00.csv" -a -name "*csv"
- 모든 csv 파일을 선택하되,profile00.csv는 선택하지 마십시오. 여기서는 그렇지 않음-a
을 의미합니다.!
sed
-i
- 파일을 제자리에서 편집1
-행 주소 지정s/^/$(head -1 profiles00.csv)\n/
- 파일의 시작 부분을 주어진 텍스트로 바꿉니다.
head
-1
- 첫 번째 행을 선택하세요.
답변3
이것은 테스트되지 않은 의사코드 스케치이므로 작동하지 않을 수 있지만 다음과 같이 하려고 합니다(파일을 덮어쓰지 않도록 먼저 파일을 백업하세요).
sed -i '1s/^/'`head -n1 profiles00.csv`'/' *.csv
파일 삽입에 대한 추가 정보:
https://stackoverflow.com/questions/9533679/how-to-insert-a-text-at-the-beginning-of-a-file