我需要循环遍历未知大小的整个文件,并删除指定列中出现给定单词(作为参数 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 代码写入临时文件,然后将其移动到位。