在bash中删除文本文件中的一行?

时间:2014-11-05 00:22:59

标签: bash awk sed

我正在尝试编写一个脚本,如果标头与该标头的字段匹配,则会从基于文本的数据库中删除一行。例如,我有一个看起来像

的文本文件
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删除该特定行?

2 个答案:

答案 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脚本将:

  • 将awk脚本的结果分配给newFile变量,其中$2是标题,$3是值,$1是输入文件。< / LI>
  • 在第一个arg的内容上覆盖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