如果在特定列中遇到参数,awk 将删除行

如果在特定列中遇到参数,awk 将删除行

我需要循环遍历未知大小的整个文件,并删除指定列中出现给定单词(作为参数 1 传入)的任何行。此外,我需要跟踪删除了多少行。我假设这是 awk 的工作,但我遇到了很多麻烦。我尝试过使用 awk match,但除了其他一些语法问题之外,我还无法将其将参数翻译成单词。

示例(文件.txt):

Katie 1234 4567 blue
Ben 3456 2345 purple
Alex 7896 6789 blue

$ script.sh blue 4

将文件编辑为:

Ben 3456 2345 purple

并输出:2 lines removed

我更感兴趣的是理解我在做什么,而不仅仅是获取代码。

答案1

#!/bin/sh
awk -v value="$1" -v column="$2" '
  $column == value {++removed; next}
  1 {print}
  END {print removed " lines removed" >"/dev/stderr"}
' <File.txt >File.txt.tmp &&
mv File.txt.tmp File.txt

说明:

  • -v value="$1"将 awk 变量设置value为 shell 脚本的第一个参数。
  • 对于每一行,如果条件$column == value为真,则执行大括号中的代码。
    • $column是列号的内容column(从 1 开始)。
    • ++removed增加已删除行的计数器。变量从 0 开始。
    • next跳到下一个输入行,这样print当条件为真时指令就不会被执行。
  • 1 {print}打印未导致next指令执行的每一行。 (1是一个始终为真的条件。)
  • END {…}执行输入末尾大括号内的代码。
  • awk 代码写入临时文件,然后将其移动到位。

相关内容