我有一个|
分隔行的文件,如果该值匹配我想从文件中删除该行并且不匹配该行,我想在第8个位置添加值检查在文件中。
以下是文件格式,我要删除在第8位具有U
值的所有行
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
A|B|DADD|H|O| |123 A Street; Apt.2|A|M
A|B|DADD|H|O| |123 A Street; Apt.2|B|M
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
我们如何在Perl中做到这一点,或者有什么方法可以使用Awk或Sed。但是删除后,我也要打印它们。
我尝试过sed,但在整个要匹配的文件中都进行了匹配。
sed -i '' "/$pattern/d" $file
答案 0 :(得分:2)
perl -F'\|' -wlane'print if $F[7] ne "U"' file > new
通过-a
开关,每一行被拆分为多个单词,并以@F
数组形式提供。可以使用-F
选项(默认为空格)设置要分割的分隔符,此处为|
。参见switches in perlrun。然后,我们只检查第8个字段并打印。
为了更改输入文件 添加-i
开关
perl -i -F'\|' -wlane'print if $F[7] ne "U"' file
或使用-i.bak
来保持(.bak
)备份。
我看到一个关于记录那些未保留在文件中的行的问题。
一种方法是为他们劫持STDERR
流
perl -i -F'\|' -wlane'$F[7] ne "U" ? print : print STDERR $_' file 2> excluded
文件excluded
获取STDERR
流,并使用2>
重定向(以bash格式)。但是,这可能是完全危险的,因为现在可能的警告已被隐藏,并且破坏了打算用于排除行的文件(因为它们也转到该文件)。
因此最好收集这些行并在最后打印它们
perl -i -F'\|' -wlanE'
$F[7] ne "U" ? print : push @exclude, $_;
END { say for @exclude }
' input > excluded
文件excluded
的所有省略(排除)行。 (我将-e
切换为-E
,以便拥有say
。)
答案 1 :(得分:1)
您可能想要这样的声音
function animateCurvedCircle(circle){
circle.animate('M130 110 C 120 140, 180 140, 170 110',{
duration: 1000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
circle.left=130;
circle.top=110;
},
easing:fabric.util.ease.easeInQuad,
});
以上对$ cat file
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
A|B|DADD|H|O| |123 A Street; Apt.2|A|M
A|B|DADD|H|O| |123 A Street; Apt.2|B|M
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
$ awk -i inplace -F'[|]' '$8=="U"{print|"cat>&2"; next} 1' file
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
A|B|DADD|H|O| |123 A Street; Apt.2|U|M
$ cat file
A|B|DADD|H|O| |123 A Street; Apt.2|A|M
A|B|DADD|H|O| |123 A Street; Apt.2|B|M
使用GNU awk。与其他awk一起,您只需执行以下操作:
-i inplace
要将删除的行记录到名为awk -F'[|]' '$8=="U"{print|"cat>&2"; next} 1' file > tmp && mv tmp file
的文件中:
log1
要记录并打印到stderr:
awk -F'[|]' '$8=="U"{print >> "log1"; next} 1' file