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

Lau*_*ren 4 awk text-processing

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

示例(文件.txt):

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

$ script.sh blue 4
Run Code Online (Sandbox Code Playgroud)

将文件编辑为:

Ben 3456 2345 purple
Run Code Online (Sandbox Code Playgroud)

和输出: 2 lines removed

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

Gil*_*il' 5

#!/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
Run Code Online (Sandbox Code Playgroud)

说明:

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