我想要一个加入单独单词的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
答案 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 $1
和firstPart
放在一起,就可以打印上一行中感兴趣的令牌与(已修改的)第一个字段的直接串联,只用空格分开。
模式$1
测试最后一个字段($NF ~ /._$/
)是否以($NF
)$
结尾(前面至少有一个其他字符{{1} }}))。
_
存储除变量.
中的尾随firstPart=substr($NF, 1, length($NF) - 1)
之外的最后一个字段的内容。_
跳过处理当前行的脚本剩余部分并移至下一行。行动firstPart
,因为它没有模式,无条件处理 - 如果到达:
next
信号重置为下一个脚本周期,表示下一行不打印任何内容。