从文本文件中提取行和短语

从文本文件中提取行和短语

我有一个文本文件,我想从中提取一些行和短语。我还想在某些地方插入几个字符。这是一个我打算在一天中定期下载的文件,其中某些值在一天中不断变化:该文件是对天气状况的简单描述,提供当前时间、温度、湿度等信息。文件中的大部分文本都不感兴趣,我正在尝试找到一种方法来从中获取我感兴趣的文本。我使用curl 获取文件,我想通过一些命令通过管道传输它(s) 将仅提取所需的部分并插入提到的字符。

我抓取的文本文件的内容看起来很像这样:

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)。最好,我希望能够将curl的输出通过管道传输到某个命令或一系列命令,这些命令将提取目标材料,插入引号和\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'为简单起见,我们将其全部放在一行上:

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

相关内容