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
我更感兴趣的是了解我在做什么,而不仅仅是获取代码。
#!/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 {…}
在输入的末尾执行大括号内的代码。