如何使用 Unix 命令删除类似的行实例?

如何使用 Unix 命令删除类似的行实例?

我有一个文件,其中包含如下行:

14|geauxtigers|90
14|geauxtigers|null

我想删除文件中所有以 null 作为最后一个词的实例。有没有办法使用 Unix 命令来做到这一点?

我打算用 Java 读取文件并查看相邻行,然后删除相邻行的前两个项相似但第三个项为空的行。有没有办法通过 Unix 工具做到这一点?

编辑:我不想盲目地删除所有以 null 作为第三项的项,我可能有以下条目:15|lsu|null 我想保留它,因为它是唯一的条目。只是,如果另一行的第三项为非空,我想保留非空值。

答案1

我想使用 awk 添加一个答案:

awk -F'|' '{if($3!="null"){a=$1;b=$2;print}else{if(a!=$1 || b!=$2)print}}' yourFile

测试

kent$  echo "14|geauxtigers|90
14|geauxtigers|null
foo|bar|blah
x|y|z
x|y|null"|awk -F'|' '{if($3!="null"){a=$1;b=$2;print}else{if(a!=$1 || b!=$2)print}}'    
14|geauxtigers|90
foo|bar|blah
x|y|z

答案2

grep -v '|null$' yourfile.txt > filtered.txt

答案3

假设行可以按任意顺序出现,并且结果按第一个字段按数字排序,这里有一个 Perl 解决方案:

echo -e "2|asd|null
11|bla|asd
14|geauxtigers|90
2|asd|2
15|lsu|null
14|geauxtigers|null" | perl -e '
while(<>) {
  $line=$_;
  s@\|[^|]*$@@;
  $hash{$_}=$line
}
for $line (sort {$a<=>$b} keys %hash) {
  print $hash{$line}
}'

答案4

cat file | grep -v '|null$' > file2

这将通过 grep 命令将名为 file 的文件(您可以在 cat 后填写其他名称)管道化,该命令会过滤带有模式的行。'-v' 反转匹配,因此所有不包含模式的行都会被匹配。最后将结果放入 file2 中。

相关内容