Bash 텍스트 일치 및 쓰기

Bash 텍스트 일치 및 쓰기

여러 개의 정렬된 txt 파일이 있습니다. 출력 파일에서 수집해야 하는 특정 데이터가 있습니다.

예를 들어:

1.txt

     Colour:    Red

     Hight:     10

2.txt

     Colour:    Blue

     Hight:     12

sed/grep과 같은 bash 명령을 사용하여 특정 단어를 검색하고 특정 문자를 무시하여 데이터를 가져와서 출력 파일에 넣는 방법.

예를 들어:

출력.txt

     Colour    Hight

      Red        10

      Blue       12

Anees를 도와주셔서 감사합니다

답변1

각 파일에 항상 2개의 필드가 있고 항상 동일한 순서라고 가정하면 sed를 사용하여 이를 수행하는 한 가지 방법이 있습니다.

#!/bin/sh

printf '%s\t%s\n' Colour Hight

sed '

    / *Colour: */ {
        s///
        h
        n
    }

    / *Hight: */ {
        s///
        G
        s/\n/\t/g
    }

' "$@"

이 답변은 hold spacesed의 기능을 사용하여 한 줄에서 다음 줄로 데이터 값을 저장합니다.

{우리는 명령문을 그룹화하기 위해 및 를 사용합니다 }. 이 그룹의 모든 명령은 주소가 지정된 행(이 경우 패턴 / *Colour */및 선택한 행) 에만 적용됩니다 / *Hight */.

*Colour *"색상" 및 "높이" 행에서 먼저 *Higth *(또는)와 일치하는 텍스트를 삭제합니다 s///.

"color" 줄에 h나머지 텍스트를 저장합니다.hold space, 인쇄하지 않고 다음 입력 줄로 점프합니다( n).

Hight 행에서는 G개행 문자 '\n' 으로 연결된 예약된 공간의 내용을 패턴 공간에 가져오거나 추가합니다 sed. 그런 다음 \t해당 개행 문자를 탭 문자로 바꾸고 sed출력을 인쇄합니다.

이 답변은 sedLinux, FreeBSD 또는 OS X 등 모든 버전에 적용됩니다.

답변2

출력 파일의 헤더를 이와 같이 배치한
echo 'Colour Hight' > out.txt
후 각 파일에 대해 다음을 수행할 수 있습니다.
awk '{printf $2" ";next;}' 1.txt >> out.txt
또는 모든 txt 파일에 대해 다음을 수행할 수 있습니다.
ls *.txt | xargs awk '{printf $2" ";if (++onr%2 == 0) print "";next;}' >> out.txt

관련 정보