파일의 처음 3줄 앞에 다른 변수를 붙이는 방법은 무엇입니까?

파일의 처음 3줄 앞에 다른 변수를 붙이는 방법은 무엇입니까?

그래서 (Windows에서) 이메일로 받은 로그를 살펴보고 모델 일련 번호를 확인하는 줄을 검색해야 합니다. 그렇게 하는 쉬운 방법은 .msg를 변환하는 보기 흉한 배치 스크립트를 작성하여 파일을 읽을 수 있습니다. 예:

cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt

그러면 3개의 고유 숫자가 남습니다. 공백이나 :를 구분 기호로 사용하여 1행에 ALPHA를, 2행에 BETA를, 3행에 GAMMA를 어떻게 추가합니까?


업데이트:파일 a21s.txt은 다음과 비슷합니다

0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416 
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414 
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414 

답변1

찾고 있는 작업을 수행하는 방법에는 여러 가지가 있으며 몇 가지 예만 있습니다.

awk 그리고 맞춤형 솔루션

귀하의 예에 맞는 한 가지 솔루션은 3개의 변수를 사용 awk하고 전달하는 것입니다. 4개의 라인이 있으면 4개의 변수를 전달해야 하기 때문에 일반적이지 않습니다.

awk명령에는 번호( $1, $2... $NF마지막 항목)를 통해 열을 관리하는 간단한 방법이 있습니다.

  • 여기에서 더 쉽게 읽을 수 있도록 이전 중간 파일을 사용합니다.a21s.txt

    awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" '
      NR==1 {print s1,$7} ;  
      NR==2 {print s2,$7} ;  
      NR==3 {print s3,$7} ; '   a21s.txt
    
    • 첫 번째 줄에서는 awk옵션을 사용하여 3개의 변수를 전달합니다 -v.
    • 다음 줄에서는 내부 변수를 사용합니다.NR, 줄 수를 유지합니다. 그래서 변수를 인쇄하러 갑니다.s1, 첫 번째 줄이 있는 경우에만s2두 번째로 ... 등등.
    • 다음 마지막 줄에서 파일 이름을 지정할 수 있으므로 프로세스를 호출하거나 해당 프로세스로 파이프할 '필요가 없습니다 .catawk
    • 변수(ALPHA,BETA...)가 일부 메커니즘(예: "Serial01, Serial02")으로 생성 가능한 경우 줄 번호 및 외부 변수에 대한 컨트롤 대신 해당 변수를 넣을 수 있습니다.
  • 실용적인 참고 사항:*nix에서는 다음을 수행할 수 있습니다.일련의 명령|중간 파일을 생성할 필요 없이 하나의 출력을 다음으로 파이핑( )합니다.
    따라서 귀하의 예에서는 다음을 직접 사용할 수 있습니다.

    cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
    

    cut이 경우 대신 명령을 사용할 수 있습니다 awk.cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt

보다 일반적인 해결책: paste+awk

다음과 같이 접두어를 붙이려는 문자열(각각 한 단어) 내에 동일한 행 수를 가진 a21s.txt파일과 또 다른 파일( ) 이 있다고 가정해 보겠습니다 .b.txt

ALPHA
BETA
GAMMA

당신은 단순히 사용할 수 있습니다

paste b.txt a21.txt | awk '{print $1,$8}' >  Air21Serials.txt

이전에 붙여넣기를 사용하여 다른 항목을 추가했기 때문에 이제 연재물 열이 8번째라는 점에 유의하세요.


메모

man awk및 에 대한 자세한 내용은 Linux 자체에 문의하십시오.man paste :-)

답변2

에코 알파>agrep.txt ; 고양이 "사전.msg" | 문자열2>>agrep.txt

그것은 정확한 라인이 아닐 수도 있습니다 .. 개념은 당신이첫 번째파일에 "Alpha"라는 단어를 넣고 싶습니다. > 기호를 사용하면 파일이 생성되고 >>를 사용하면 파일에 추가됩니다. "개행"이 없으면 거기에 ALPHA라는 단어를 넣은 다음 첫 번째 메시지를 추가해야 합니다.

코드가 정확하게 작동하려면 약간의 플레이가 필요할 수도 있습니다.

편집 : 다음을 사용하여 검색 중고양이그리고printf에코는 OS에 따라 다를 수 있으므로 에코보다 더 나은 옵션입니다.

예: cat ("ALPHA: ") > agrep.txt ; 고양이 "사전.msg" | 문자열2>>agrep.txt

그리고 "하나의 라이너" 명령을 수행하려면 첫 번째 파이프가 ; 또는 &&

; 중간 명령은 항상 다음 명령을 실행합니다. && 명령 사이는 이전 명령이 성공한 경우에만 다음 명령을 실행하고 || (이중 파이프) 이전 명령이 실패한 경우에만 다음 명령을 실행합니다.

답변3

strings2귀하의 입력 내용이 무엇인지, 어떤 모양인지 잘 모르겠습니다 . 따라서 이것이 예상대로 작동할 것이라고 100% 확신할 수 없습니다. 그러나 아마도 그것은 적어도 당신에게 올바른 방향을 알려줄 것입니다. catstdin에서 입력을 받을 수 있습니다. 그래서, 당신도 할 수 있습니다

echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt

관련 정보