我有一个文件,其中包含如下行:
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 中。