텍스트 파일에서 줄과 문구 추출

텍스트 파일에서 줄과 문구 추출

일부 줄과 문구를 추출하려는 텍스트 파일이 있습니다. 또한 특정 위치에 몇 개의 문자를 삽입하고 싶습니다. 다음은 하루 종일 변경되는 특정 값을 포함하여 하루 종일 주기적으로 다운로드하려는 파일입니다. 파일은 기상 조건에 대한 간단한 설명으로 현재 시간, 온도, 습도 등에 대한 정보를 제공합니다. 파일에 있는 텍스트의 대부분은 나에게 관심이 없으며 나는 그 파일에서 내가 관심 있는 텍스트를 얻을 수 있는 방법을 찾으려고 노력하고 있습니다. 컬을 사용하여 파일을 가져오고 필요한 부분만 추출하고 언급된 문자를 삽입하는 일부 명령을 통해 파이프하고 싶습니다.

제가 스크랩한 텍스트 파일의 내용은 다음과 같았습니다.

Smyrna, Smyrna Airport, TN, United States (KMQY) 36-00-32N 086-31-12W
Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC
Visibility: 10 mile(s):0
Sky conditions: partly cloudy
Temperature: 86 F (30 C)
Heat index: 93.4 F (34.1 C):1
Dew Point: 73 F (23 C)
Relative Humidity: 66%
Pressure (altimeter): 30.01 in. Hg (1016 hPa)
ob: KMQY 091456Z 18006 10SM SCT035 30/23 A3001
cycle: 15

이 줄 중 2, 4, 5, 8줄에만 관심 있는 텍스트가 포함되어 있습니다. 다른 줄은 삭제할 수 있습니다. 또한 대상 행의 콘텐츠 대부분은 필요하지 않습니다. 이 파일의 내용은 시간, 온도, 습도 등의 변수가 정기적으로 변경되어 다소 불안정하다는 점에 유의해야 합니다. 원하지 않는 재료를 제거한 후 완성된 제품이 다음과 같기를 바랍니다.

'Aug 09, 2016 - 10:56 AM EDT\nconditions: partly cloudy\n86 F\nHumidity: 66%'

삽입된 문자(\n 및 '(시작과 끝의 따옴표))는 줄 바꿈을 나타내고 실행할 프로그램에 전체 줄(공백 포함)을 포함하는 데 필요합니다. 이 출력(imagemagick)을 제공하겠습니다. 가급적이면 컬의 출력을 일부 명령 또는 대상 자료를 추출하고 따옴표와 \n 시퀀스를 삽입한 다음 파일에 쓰는 일련의 명령으로 파이프할 수 있기를 바랍니다. 그처럼

curl http://my.weat.her/local.txt | command(s) > currentcond.txt

이 작업을 수행하기 위한 제안 사항이 있는 사람이 있습니까?

답변1

명령의 출력이 안정적이고 일관적이라면 줄 번호를 기반으로 curl매우 기본적인 명령 세트를 만들 수 있습니다.sed

예를 들어

2s! /.*!!

두 번째 줄을 선택하고 그 이후의 모든 항목을 삭제하므로 /변환하세요 .

Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC

입력하다

Aug 09, 2016 - 10:56 AM EDT

\\n교체품을 추가할 수 있습니다 .

그런 다음 -n옵션을 사용하여 대체 내용이 있는 줄만 sed인쇄 하도록 합니다.p

그래서 우리는 다음과 같이 끝납니다:

sed -n -e '2s! /.*!\\n!p' \
       -e '4s/Sky \(.*\)/\1\\n/p' \
       -e '5s/.*: \([0-9]* F\).*/\1\\n/p' \
       -e '8s/Relative //p'

마지막으로 개행 문자를 제거해야 합니다. tr -d '\012'단순화를 위해 모든 내용을 한 줄에 넣겠습니다.

sed -n -e '2s! /.*!\\n!p' -e '4s/Sky \(.*\)/\1\\n/p' -e '5s/.*: \([0-9]* F\).*/\1\\n/p' -e '8s/Relative //p' | tr -d '\012'

해결책은부서지기 쉬운입력하면 다를 수 있지만 이해하기 쉽습니다.

그럼 덜 취약한 것을 살펴보고 패턴을 기반으로 선을 감지해 보겠습니다.

awk '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }                      
     /^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
     /^Temperature: / { t=$2 }
     /Relative Humidity: / { h=$3 }
     END { print d"\\n"s"\\n"t" F\\nHumidity: "h }
    '

날짜가 UTC 등으로 끝나야 하는 한, 줄의 순서는 그다지 중요하지 않습니다.

업데이트된 질문을 기반으로 편집되었습니다.

안에 따옴표를 넣는 것은 awk때때로 고통스러울 수 있으므로 이를 속이고 변수( q이 경우)에 미리 할당한 다음 print최종 명령문에서 직접 사용할 수 있습니다.

awk -vq=\' '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }                      
            /^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
            /^Temperature: / { t=$2 }
            /Relative Humidity: / { h=$3 }
            END { print q""d"\\n"s"\\n"t" F\\nHumidity: "h""q }
           ' 

관련 정보