跳过以字符开头的行,并删除小于第二列的匹配行

时间:2019-05-23 21:02:18

标签: shell awk grep

我的文件格式如下:

Qil
Lop
A D E
a 1 10
b 2 21
c 3 22
d 4 5
3 5 9

我需要跳过以模式'Qil'或'Lop'或'ADE'开头的行,并删除第三列的值大于10的行,并将整个内容保存在2个不同的文件中,格式如下所示下面。 输出文件示例:

Output file 1
    Qil
    Lop
    A D E
    a 1 10
    d 4 5
    3 5 9 

Output file 2
a
d
3

我的代码:

while read -r line; if [[ $line == "A" ]] ||[[ $line == "Q" ]]||[[ $line == "L" ]] ; then 
awk '$2 < "11" { print $0 }' test.txt
awk '$2 < "11" { print $1 }' test1.txt
done < input.file

2 个答案:

答案 0 :(得分:3)

请您尝试以下。

awk '
/^Qil$|^Lop$|^A D E$/{
   val=(val?val ORS:"")$0
   next
}
$3<=10{
   if(!flag){
       print val > "file1"
       flag=1
   }
   print > "file1"
   if(!a[$1]++){
       print $1> "file2"
   }
}'  Input_file

这将根据OP的要求创建2个名为file1file2的输出文件。

答案 1 :(得分:2)

这可以在单个awk中完成:

awk '$1 !~ /^[QLA]/ && $2 <= 10' file

1 10
4 5
5 9

如果您只想打印第一列,请使用:

awk '$1 !~ /^[QLA]/ && $2 <= 10 { print $1 }' file

1
4
5