한 파일의 처음 7줄을 다른 파일의 내용으로 바꿉니다.

한 파일의 처음 7줄을 다른 파일의 내용으로 바꿉니다.

두 개의 파일이 있습니다. 하나는 짖고 file1.txt있고 다른 하나는 person1.txt. 다음 예와 같이 모두 몇 줄의 텍스트를 포함합니다.

  • file1.txt
    word1
    word2
    word3
    word4
    word5
    word6
    word7
    word8
    word9
    
  • person1.txt
    givi sixarulidze
    

내가 하고 싶은 것은 코드 file1.txt의 처음 7줄을 person1.txt.

  • 원하는 출력:
    givi sixarulidze
    word8
    word9
    

어떻게 해야 하나요?

답변1

cp person1.txt result.txt
tail -n+8 file1 >> result.txt

답변2

GNU를 사용한 sponge내부 편집 file1.txt:

{ cat person1.txt; tail -n +8 file1.txt; } | sponge file1.txt

이렇게 하면 person1.txt파일의 처음 7줄을 제외한 모든 줄이 파일과 연결 file1.txt되고 결과가 file1.txt.

sed당신은 같은 일을 할 것 입니다

sed -e '1r person1.txt' -e '1,7d' file1.txt | sponge file1.txt

8,$!d( 대신 사용할 수 있음 1,7d) 또는 GNU를 사용하는 sed경우

sed -i -e '1r person1.txt' -e '1,7d' file1.txt

person1.txt이렇게 하면 내용이 처음에 삽입된 다음 file1.txt입력 파일의 처음 7줄을 건너뜁니다.

답변3

또 다른 가능성은 다음과 같습니다 awk.

awk 'NR==FNR || FNR>7' person1.txt file1.txt > result.txt

person1.txt이 내용이 먼저 처리된 후 처리 됩니다 file1.txt. 가능한 경우 현재 줄을 인쇄합니다.

  • 우리는 두 파일 중 첫 번째 파일을 처리하고 있습니다. 여기서 NR(글로벌 라인 카운터)는 FNR각 파일의 라인 카운터와 같습니다.또는
  • 파일당 라인 카운터가 7보다 큽니다. (이는 두 번째 파일을 처리할 때의 제한일 뿐이며 현재는 NR더 큽니다 FNR.)

건너뛰려는 각 파일에 대한 줄 사양으로 이를 확장할 수도 있습니다.

awk -- '--skip<=0' person1.txt skip=7 file1.txt skip=4 file2.txt >result.txt

그런 다음 각 파일 이름 앞에 변수 할당을 추가하고 해당 입력 파일에서 건너뛰려는 줄 수로 awk변수 를 설정하면 됩니다 . skip프로그램은 awk처리된 각 행에 대해 이 변수(1씩 감소하는 경우)가 0 미만인지 확인합니다. 이는 건너뛸 행 수에 도달했음을 나타냅니다. 그러면 조건은 가 되고 true현재 행이 인쇄됩니다.

--실제 프로그램의 첫 번째 명령은 로 끝나기 때문에 "옵션 끝" 지정자가 필요 합니다 --.

답변4

$ ed file1
1,7d
0r person1
w
q

또는 스크립트로:

ed -s file1 <<'EOF'
1,7d
0r person1
w
q
EOF

또는

printf '%s\n' 1,7d '0r person1' w q | ed -s file1

오늘날에는 ex(using vi)이 (using)보다 더 일반적이지만 ed둘 다 POSIX에 지정되어 있고 후자가 더 간단합니다. 실제 이식성을 위해 코드 예제를 바꾸십시오 ed.ex

관련 정보