从文件perl中删除行

时间:2019-06-13 15:56:33

标签: perl awk sed

我有一个|分隔行的文件,如果该值匹配我想从文件中删除该行并且不匹配该行,我想在第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

2 个答案:

答案 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