次のテキストファイルがあります。
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
最後と一致手紙¹ 最初の行から 2 番目の行の場合、最初の行は手紙はい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
この場合、中間行は2回印刷されます(一度はc
最初に一致し、1回は最初のフィールドa
の最後に一致します)。
答え3
使用sed
$ sed -En '/^[^ ]*a/{N;/\nc/p}' input_file
uenja 9999
comxq 8