我正在尝试编写一个脚本,如果标头与该标头的字段匹配,则会从基于文本的数据库中删除一行。例如,我有一个看起来像
的文本文件Name Age Identification Wage
Micheal 25 19339 10
Jane 37 19338 10
John 21 19334 12
Peter 35 19330 30
我调用一个脚本,并传递标题名称和值,它会在标题下查找包含该值的行,并立即删除它。所以,把
./script.sh filename Identification 19334
应删除标识为19334的数据库中的条目,以便文件现在如下所示:
Name Age Identification Wage
Micheal 25 19339 10
Jane 37 19338 10
Peter 35 19330 30
我如何使用Awk脚本或sed删除该特定行?
答案 0 :(得分:1)
这个awk不会直接更新文件,但会产生所需的输出:
awk -v header="Identification" -v value="19334" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i} $(cols[header])!=value' data
Name Age Identification Wage
Micheal 25 19339 10
Jane 37 19338 10
Peter 35 19330 30
header
标记Identification
-v
value
设置为值以匹配另一个-v
标志cols
关联数组,以便为列标题指定其字段编号header
指示列与value
将删除与value
匹配的多行。
我的bash-fu很弱,但会做你想做的事情:
#!/bin/bash
newFile=$(awk -v header="$2" -v value="$3" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i
} $(cols[header])!=value' $1);
echo "$newFile" > $1
bash脚本将:
newFile
变量,其中$2
是标题,$3
是值,$1
是输入文件。< / LI>
newFile
变量的内容,$ 1 您可以按照以下描述运行它:
./script.sh data Identification 19334
改变原始文件并产生:
Name Age Identification Wage
Micheal 25 19339 10
Jane 37 19338 10
Peter 35 19330 30
有一点需要注意的是,拼写错误的标题会用原始内容覆盖整个文件,可能会让你想知道为什么它没有用。
答案 1 :(得分:0)
awk -v val=$3 -v hdr=$2 '{for(i=1; i<=NF; i++){if($i==hdr && NR==1){col=i;break}} if($col!=val){print}}' $1 > newfile && mv newfile $1