Regex 在单独的文件中提取具有特定模式的行

Regex 在单独的文件中提取具有特定模式的行,regex,perl,sed,awk,pattern-matching,Regex,Perl,Sed,Awk,Pattern Matching,输入文件具有以下行,并使用一个文件中的第二个字段“+”符号行和另一个文件中的“-”符号行分隔这些行: 24 + I am the Five man 22 - Who are you? The new number two! 51 + . . . And four on the floor 42 + 16 - Who is number one? 33 - I three you. 当$2为'+',a=$1+500,b=$1-500时,当$2为

输入文件具有以下行,并使用一个文件中的第二个字段“+”符号行和另一个文件中的“-”符号行分隔这些行:

24 +  I am the Five man    
22 -  Who are you?  The new number two!    
51 +  . . . And four on the floor    
42 +    
16 -  Who is number one?    
33 -  I three you.

当$2为'+',a=$1+500,b=$1-500时,当$2为'-',a=$1-500,b=$1+500时,是否可能“a”和“b”是新的变量。

问题的标题有点不清楚,我马上编辑它。与此同时,答案如下:

awk '/^[0-9]+ \+/{print > "a"} /^[0-9]+ -/{print > "b"}'

此解决方案将输出过滤为文件f1和f2

awk '{ if ($2 == "+") print >>"f1"; else if ($2=="-") print >>"f2"; }' datafile
另一种选择

awk 'BEGIN{m["+"]="plus.txt";m["-"]="minus.txt"} $2 ~ /^[+-]$/{print>>m[$2]}' 
GNU代码:

使用Perl:

perl -lne '/^\d+ -/ && print(STDERR) || print' input 2> minus > plus
以稍微不同的形式:

perl -lpe 'select(/^\d+ -/?STDERR:STDOUT)' input 2> minus > plus
也可以使用
tee

tee >(sed -n '/^[0-9]* -/p' > minus) < input | \
   sed -n '/^[0-9]* +/p' > plus
tee>(sed-n'/^[0-9]*-/p'>减)plus

使用
awk
您只需执行以下操作:

awk '$2=="+"{print>"f1";next}{print>"f2"}' file
演示:

$ cat file
24 +  I am the Five man
22 -  Who are you?  The new number two!
51 +  . . . And four on the floor
42 +
16 -  Who is number one?
33 -  I three you.

$ awk '$2=="+"{print>"f1";next}{print>"f2"}' file

$ cat f1
24 +  I am the Five man
51 +  . . . And four on the floor
42 +

$ cat f2
22 -  Who are you?  The new number two!
16 -  Who is number one?
33 -  I three you.
这将把“+”行放在文件1中,其他行放在文件2中:

awk '{print > ("file" ($2~/+/?1:2))}' file

是否可以基于第二个字段(使用awk具有“+”和“-”符号)在两个文件中分隔上述行…当$2为“+”、a=$1+500和b=$1-500时,是否可以同时将$2为“-”、a=$1-500和b=$1+500“a”和“b”是新的变量…你的意思是
'$2==“+”{print>“a”}$2==“-”{print>“b”}”
@Nirk好的,我以为第一个数字只是编辑器插入的行号,而不是输入文件的一部分。修正表达式来处理这个问题。你好,sudo_O,现在我需要取第一个有“+”符号的字段,通过每个记录加500减去500来分配给新变量。你好,Ed Morton,现在我需要取第一个带“+”号的字段,通过每个记录加500减去500来分配给新变量。你说的“分配给新变量”是什么意思?只需使用新需求以及示例输入和预期输出更新您的问题,或者打开一个新问题。
awk '{print > ("file" ($2~/+/?1:2))}' file