파일의 특정 줄에 텍스트 삽입

파일의 특정 줄에 텍스트 삽입

파일의 특정 줄에 텍스트를 삽입하는 방법은 무엇입니까? 사용할 수 있는 가장 간단한 방법은 무엇입니까? ( bash,,, sed? awk)

내가 하고 싶은 일은 아마도 간단하지만 어디서부터 시작해야 할지 모르겠습니다. 이 작업을 수동으로 수행하려면 시간이 너무 많이 걸립니다(나중에 Excel/Calc에서 사용하기 위해 변경해야 하는 파일이 많습니다).

다음은 내 입력 파일의 예입니다.

4.06
4.05
5.04
4.06
34.50
56.06
45.33
36.44

나는 다음과 같은 것을 원합니다(1행과 5행 앞에 텍스트가 삽입됨).

Exp1    
4.06
4.05
5.04
4.06
Exp2
34.50
56.06
45.33
36.44

어떻게 해야 하나요?

답변1

awk 'NR==1{print "Exp1"}NR==5{print "Exp2"}1' file

1개의 결말은 을 의미합니다 {print}.

sed '1i\
Exp1
5i\
Exp2
' file

이를 더 많은 숫자로 확장하려면 awk간단합니다.

awk 'NR%4==1{print "Exp"++i}1' file

숫자가 다르면 sed가 해당 작업에 적합한 도구가 아니라고 가정해 보겠습니다. 가능하지만 예쁘지는 않습니다.


학문적 호기심으로 다음과 같이 sed에 있습니다.

sed '1{ 
    h
    s/^.*$/Exp0/
    x   
}
x
s/^4//
s/^3/4/
s/^2/3/
s/^1/2/
/^E/ { 
    s/$/|/
    :x
    s/0|/1/
    s/1|/2/
    s/2|/3/
    s/3|/4/
    s/4|/5/
    s/5|/6/
    s/6|/7/
    s/7|/8/
    s/8|/9/
    s/9|/|0/
    tx
    s/^Exp|/Exp1/
    p
    s/^/1/
}
x' file

답변2

각 실험의 데이터 포인트 수가 항상 4개인 경우 다음 Perl 단일 라이너를 사용할 수 있습니다.

perl -ple '$. % 4 == 1 and print "Exp", ++$i' your_file

어떻게 작동하나요?

  • -p스위치는 Perl에게 주어진 파일을 한 줄씩(기본적으로) 반복하고 사용자가 제공한 코드를 실행한 후 각 줄을 인쇄하도록 지시합니다.
  • -l스위치는 Perl이 자동으로 print각 명령문에 개행 문자를 추가하도록 지시합니다(기본값).
  • -e스위치는 Perl에게 다음에 실행될 코드(파일의 각 행이 인쇄되기 전에 실행될 코드)가 있음을 알려줍니다.
  • 특수 변수는 $.현재 처리 중인 줄 번호를 보유합니다. 줄 번호가 1 모듈로 4( )와 같다면 그 앞에 삽입 $. % 4 = 1해야 한다는 의미입니다 .Exp #
  • 그래서 우리는 테스트 $. % 4 == 1하고 true이면 인쇄합니다 Exp ++$i\n( \n스위치에 의해 추가된 위치 -l). 이는 정의되지 않은 변수가 정수로 처음 사용될 때 Perl에서 0 값을 할당하기 때문에 작동합니다.

여러 파일에서 작동하도록 만들기

  • $.한 번에 여러 파일을 처리하는 경우 이 변수는 값을 재설정하지 않습니다. 분명히 이것은 당신이 원하는 것이 아닙니다. 블록 -p을 조작할 수 있도록 위 줄에서 생성된 암시적 루프를 명시적으로 작성하여 이 문제를 해결할 수 있습니다 continue.

    perl -le '
        while(<>){
            $. % 4 == 1 and print "Exp ",++$i
        } continue {
            print;             # Print the current line
            if(eof){           # If the next line is the end-of-file
                close ARGV ;   # Close the current filehandle to reset $.
                $i = 0     ;   # Reset the experiment counter if you need
            }
        }
    ' list_of_your_files
    

노트

  • 위의 두 솔루션 모두 수정된 파일을 표준 출력으로 인쇄합니다. 내부 편집(즉, 파일 자체 편집)을 시뮬레이션하려면 -i스위치를 추가하십시오.

    perl -pi -le '$. % 4 == 1 and print "Exp", ++$i' your_file
    
    • 다른 솔루션에서도 비슷한 작업을 수행하세요.
    • 스위치 바로 뒤에 다른 스위치를 두지 마십시오. 스위치 -i는 그 뒤의 모든 스위치를 백업 파일을 생성하는 데 사용되는 확장자로 해석하기 때문입니다.

    • -i지금은 테스트하지 말고 결과에 만족하면 추가하는 것이 좋습니다 .

답변3

외부 언어가 필요하지 않으며 몇 가지 표준 명령만 사용하면 됩니다. 예를 들어, Origin.txt의 5행에 일부 콘텐츠를 삽입하려면 다음을 수행합니다.

tmpfile=`mktemp`
head -n4 origin.txt > $tmpfile
echo "I'm line 5 now" >> $tmpfile
tail -n +5 origin.txt >> $tmpfile
mv $tmpfile origin.txt

답변4

파일의 지정된 줄 시작 부분에 주석(#) 기호를 추가하는 방법을 찾고 있는 이 질문을 발견했습니다. 위의 예와 다른 몇 가지 예를 사용하여 이것이 지정된 줄에 무언가를 인쇄하는 awk 명령이라는 것을 알았습니다.

awk 'NR==1{print "#"$0; next}1' <file

NR==1고려해야 할 라인입니다 . 제공된 줄의 나머지 부분을 포함하는 문자열에 삽입하여
print "#"해당 줄을 건너뛰도록 지시하고(이미 인쇄되었으므로 그렇지 않으면 두 번 표시됩니다) 위에서 언급한 대로 파일의 나머지 부분에 후행 삽입을 합니다. $0next1

관련 정보