xargs 및 sed를 사용하여 한 파일의 첫 번째 줄을 다른 파일로 복사

xargs 및 sed를 사용하여 한 파일의 첫 번째 줄을 다른 파일로 복사

분할된 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

관련 정보