テキストファイルから行とフレーズを抽出する

テキストファイルから行とフレーズを抽出する

いくつかの行とフレーズを抽出したいテキストファイルがあります。また、特定の場所にいくつかの文字を挿入したいと思います。以下は、一日中変更される特定の値を含む、一日中定期的にダウンロードしたいファイルです。ファイルは気象条件の簡単な説明で、現在の時刻、温度、湿度などに関する情報を提供します。ファイル内のテキストのほとんどは私に興味がなく、私はそのファイルから私が興味のあるテキストを取得する方法を見つけようとしています。カールを使用してファイルをインポートし、必要な部分だけを抽出し、上記の文字を挿入するいくつかのコマンドを介してパイプしたいと思います。

私がスクラップしたテキストファイルの内容は次のとおりです。

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! /.*!!

2行目を選択し、それ以降のすべての項目を削除するので、/変換してください。

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'簡単にするために、すべての内容を1行に入れます。

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 }
           ' 

おすすめ記事