AWK:从2个连续的行中加入单独的单词

时间:2017-05-27 00:29:02

标签: bash awk text-parsing

我想要一个加入单独单词的AWK命令:

  

第一部分在行尾,最后以“_”结尾。

     

第二部分位于下一行的开头。

(PS:有一些线条同时具有第二部分和第一部分,如下例所示)

示例:

Bla bla bla bla SATU_
RDAY bla bla, bla bla
bla bla bla bla bla SUN_
DAY: bla bla bla bla M_
ONDAY. Bla bla bla bla TU_
ESDAY, bla bla bla.

结果:

Line 1: SATURDAY
Line 3: SUNDAY
Line 4: MONDAY
Line 5: TUESDAY

5 个答案:

答案 0 :(得分:2)

$ awk 'p~/_$/{sub(/_$/,"",p);print "Line " (NR-1) ":", p $1}{p=$NF}' file
Line 1: SATURDAY
Line 3: SUNDAY:
Line 4: MONDAY.
Line 5: TUESDAY,

答案 1 :(得分:1)

使用GNU awk进行多字符RS:

$ awk -v RS='[[:alpha:]]+_\n[[:alpha:]]+' 'RT!=""{sub(/_\n/,"",RT); print RT}' file
SATURDAY
SUNDAY
MONDAY
TUESDAY

或与任何awk:

$ awk 'w{w=w $1; gsub(/[^[:alpha:]]/,"",w); print w; w=""} /_$/{w=$NF}' file
SATURDAY
SUNDAY
MONDAY
TUESDAY

如果你真的想要包含任何awk的起始行号:

$ awk 'w{w=w $1; gsub(/[^[:alpha:]]/,"",w); printf "Line %d: %s\n", NR-1, w; w=""} /_$/{w=$NF}' file
Line 1: SATURDAY
Line 3: SUNDAY
Line 4: MONDAY
Line 5: TUESDAY

答案 2 :(得分:0)

不太确定您的所有要求,但是:

awk 'x  {sub("[^A-Z].*", "", $1); print "Line "n": "x $1; x = ""}
     sub("_$", "", $NF) {x = x $NF; n = NF}' input.txt

HTH

答案 3 :(得分:0)

使用GNU awk:

$ awk 'p{print gensub(/[^A-Z]$/,"","g",$1);p=0}/_$/{printf "%s",gensub("_","","g",$NF);p=1}' file
SATURDAY
SUNDAY
MONDAY
TUESDAY

答案 4 :(得分:0)

符合POSIX标准的解决方案:

awk '
  firstPart != "" { sub(/[[:punct:]]$/, "", $1); print firstPart $1 } 
  $NF ~ /._$/ { firstPart=substr($NF, 1, length($NF) - 1); next } 
  { firstPart= "" }
' file
  • 模式(条件)firstPart != ""仅在上一个行中找到感兴趣的令牌且仅执行相关的<时才为真em> action ({ ... }):

    • sub(/[[:punct:]]$/, "", $1)在第1个字段中替换(sub())标点字符($)的尾随([[:punct:]])实例(如果有)({ {1}})使用空字符串,从而有效地删除它。

    • $1只需将print firstPart $1firstPart放在一起,就可以打印上一行中感兴趣的令牌与(已修改的)第一个字段的直接串联,只用空格分开。

  • 模式$1测试最后一个字段($NF ~ /._$/)是否以($NF$结尾(前面至少有一个其他字符{{1} }}))。

    • _存储除变量.中的尾随firstPart=substr($NF, 1, length($NF) - 1)之外的最后一个字段的内容。
    • _跳过处理当前行的脚本剩余部分并移至下一行。
  • 行动firstPart,因为它没有模式,无条件处理 - 如果到达

    • 只有在手边的线条不包含任何感兴趣的标记时才会到达。
    • next信号重置为下一个脚本周期,表示下一行不打印任何内容。