第一行的最后一个字母和下一行的第一个字母

第一行的最后一个字母和下一行的第一个字母

我有这样的文本文件:

qwery 45
uiopbmc 6
uenja 9999
comxq 8

我想说:

mylist=['a','c']
if last letter in the line is 'a' (before the number) and the first letter in the next line is 'c', print both two lines.

结果:

uenja 9999
comxq 8

我知道 sed 中的第一行如“s/”,但我如何说出数字之前的最后一个字母和下一行的第一个字母?

答案1

sed -n '1N;/a .*\nc/p;N;D'

将报告包含"a "后跟以 . 开头的行的行"c"

也可以看看:

sed -n '1N;/a[^[:alpha:]]*\n[^[:alpha:]]*c/p;N;D'

匹配a最后一个¹ 在第一行中,对于第二行,其中第一行c

请注意,在这样的输入上:

xa 123
c1a 234
c2a 345

它报告了:

xa 123
c1a 234

c1a 234
c2a 345

两者都符合要求。


严格来说,尽管α名称,它不限于字母表中的字母,[[:alpha:]]匹配构成人类语言单词的字符,无论它们是拉丁语或希腊语等字母表还是不像汉字......至少在 GNU 系统上,你会发现它也匹配 0123456789 以外的数字以满足冲突的 POSIX/C 标准要求: alnum = alpha + digital,但该数字仅限于 0123456789。

答案2

awk

# first field ends with 'a' and next line starts with 'c'
# i.e. current line starts with 'c' and previous line's first field ends with 'a'
$ awk 'p1 ~ /a$/ && /^c/{print p0; print} {p1=$1; p0=$0}' ip.txt
uenja 9999
comxq 8

借鉴 Stéphane Chazelas 的意见回答

$ cat ip.txt
xa 123
c1a 234
c2a 345

$ awk 'p1 ~ /a$/ && /^c/{print p0; print} {p1=$1; p0=$0}' ip.txt
xa 123
c1a 234
c1a 234
c2a 345

在这种情况下,中间行将打印两次(一次作为c在开头的匹配,另一次作为a在第一个字段末尾的匹配)。

答案3

使用sed

$ sed -En '/^[^ ]*a/{N;/\nc/p}' input_file
uenja 9999
comxq 8

相关内容