【问题标题】:How to perform "greater than" with sed or awk to delete specific lines?如何使用 sed 或 awk 执行“大于”以删除特定行?
【发布时间】:2014-05-04 06:17:43
【问题描述】:

如题,sed 如何执行“大于”删除特定行?
我有一个这样的文件:

bash-4.2$ cat testfile.txt
string1 1 1
AAA 2 2
string2 2 2
BBB 3 3
string3 3 3
string4 4 4
string5 5 5
string6 6 6
CCC 6 6
string7 7 7
string8 8 8
string9 9 9
string10 10 10
DDD 11 11
string11 11 11
string12 12 12
string13 13 13

我想删除一些包含 "string[[:digit:]]" 但 string1 到 string"$num" 的行,num 由变量定义。例如,我想保留那些包含 string1-5 并删除 string6-string99 的行,我试过了:

#!/bin/bash
read -p "Please Assign the Number of String Line that You Wanna Keep: " num
cat testfile.txt | sed -e "/string[`expr $num + 1`-9]/d" > new_testfile.txt

但它只在 0-8 范围内工作,有没有办法用 sed 或 awk 来执行它?

【问题讨论】:

  • 需要用 sed 做吗?
  • stringxx 总是排在第一个字吗?
  • 是的,总是第一个字

标签: regex bash sed awk


【解决方案1】:

这个“awk”应该这样做:

awk '/^string/ {n=substr($1,7)+0;if (n>5 && n<100) next}1' file
string1 1 1
AAA 2 2
string2 2 2
BBB 3 3
string3 3 3
string4 4 4
string5 5 5
CCC 6 6
DDD 11 11

它只是跳过任何带有string"x" 的行,其中x 大于5 而小于100


如果高/低来自变量,应该这样做:

high=99
low=6
awk '/^string/ {n=substr($1,7)+0;if (n>=l && n<=h) next}1' h="$high" l="$low" file
string1 1 1
AAA 2 2
string2 2 2
BBB 3 3
string3 3 3
string4 4 4
string5 5 5
CCC 6 6
DDD 11 11

【讨论】:

  • 值得指出的是,脚本末尾的1awk 的简写,是else print $0; - 换句话说,“对于所有与早期正则表达式不匹配的行, 使用打印整行的默认动作”
  • @Floris 不太正确。 1 确实意味着打印当前行,与1 {print $0}' 相同。没有涉及else。如果前面的表达式命中next,它将跳到下一行而不使用1
  • 我试图简化。你是对的,这只是因为前面的语句中的next。这真的是为了邀请您澄清您的答案 - 特别是当他们第一次见到awk时让很多人感到困惑的“神奇1”
  • 没问题,看到很多人问1。甚至更多,而有些人使用7 ;)
  • 确实,这就是答案。但问题是什么?你看到codegolf.stackexchange.com/questions/21835/…了吗?我喜欢 #define SIX 1 + 5; #define NINE 8 + 1; printf("six times nine is %d\n", SIX * NINE);... - 你真的需要读过书才能了解它有多聪明。
【解决方案2】:

这是awk的一种方式:

$ read -p "Please Assign the Number of String Line that You Wanna Keep: " num
Please Assign the Number of String Line that You Wanna Keep: 5
$ awk -v max="$num" '/string/{line=$0;sub(/string/,"",$1);if($1+0<=max){print line};next}1' file
string1 1 1
AAA 2 2
string2 2 2
BBB 3 3
string3 3 3
string4 4 4
string5 5 5
CCC 6 6
DDD 11 11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多