【问题标题】:Sed/Awk deleting selective linesSed/Awk 删除选择行
【发布时间】:2015-08-30 03:54:26
【问题描述】:

这可能是一个简单的问题,但我正在努力寻找解决方案,谁能提供一个简单的 UNIX sed 或 awk 命令来删除从第 5 行开始的文件的每 3 和 4 行。

【问题讨论】:

  • 可能有助于显示一些示例输入和您想要的输出。

标签: unix awk sed line


【解决方案1】:

如果您使用的是 GNU sed,则可以使用FIRST~STEP 地址格式,例如。

sed -e '6~3 d' -e '8~4 d' file

删除第 6 行,然后每 3 行,删除第 8 行,然后每 4 行。

【讨论】:

  • Cheers 发现了这个,但没有 GNU sed,应该这么说!
【解决方案2】:

假设我已经了解要求,您可以使用awk,如下所示:

pax$ echo '1
2
3
4
5
6
7
8
9
10
11
12
13
14
15' | awk '{if (((NR - 5) % 4 < 2) || (NR < 5)) {print}}'
1
2
3
4
5
6
9
10
13
14

如您所见,这使用NR(行号)来决定是否打印该行。

从第 5 行开始,它打印两个然后跳过两个,无限循环。低于 5,它会打印所有内容。

如果我完全误解了你想跳过哪些行,那么理论仍然是正确的,你只需要调整if 语句。

【讨论】:

  • 哦,那个 LISP 风格:) 这相当于awk '(NR - 5) % 4 &lt; 2 || NR &lt; 5'
【解决方案3】:

一个 awk 解决方案,您将数字作为参数传递:

awk -v start=5 -v d1=3 -v d2=4 '
    {n = NR - start}
    n > 0 && (n % d1 == 0 || n % d2 == 0) {next} 
    1
'

这会跳过第 8、11、14、... 和第 9、13、17、...行

【讨论】:

    【解决方案4】:

    Perl 怎么样?

    perl -pi -e 'print if $. < 5 or 1 == $. % 4 or 2 = $. % 4' your_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2019-12-01
      相关资源
      最近更新 更多