删除文本文件中包含少于4个管道的行

nei*_*ilH 2 linux bash awk sed s

我有一个文本文件,数据由4个单独的|分开 文件中有一些问题行.这些行包含少于4个管道.不需要问题行中的数据,我想在文件上运行一个命令,删除包含少于四个管道的任何行.我还想知道之后删除了多少行,所以如果在应用命令后可以在屏幕上打印这将是理想的.

样本数据:

865|Blue Moon Club|Havana Project|34d|879
899|Soya Plates|Dimsby|78a|699
657|Sherlock
900|Forestry Commission|Eden Project|68d|864
Run Code Online (Sandbox Code Playgroud)

期望的输出:

865|Blue Moon Club|Havana Project|34d|879
899|Soya Plates|Dimsby|78a|699
900|Forestry Commission|Eden Project|68d|864
Run Code Online (Sandbox Code Playgroud)

我试过awk '|>=3' file.txt哪个不起作用.有很多信息awk,其中一些是我发现的,但是由于其庞大的体积,很难找到我想要做的事情.

ric*_*ici 7

消除线条:

grep '|.*|.*|.*|' file > newfile
Run Code Online (Sandbox Code Playgroud)

要计算坏线的数量:

grep -cv '|.*|.*|.*|' file
Run Code Online (Sandbox Code Playgroud)

这不会进行编辑; 你可以这样做,sed但是对新文件进行这样的编辑往往更安全,以避免在出错时丢失数据.

第一个grep模式匹配具有四个管道符号的任何行.(默认情况下,grep使用"Basic"正则表达式,您必须在其中编写交替运算符\|.因此您可以将其|用作普通字符.)

第二次调用count(-c)非匹配(-v)行的数量.

这是一个简单的sed解决方案:

sed -n -i.bak  '/|.*|.*|.*|/p' file
Run Code Online (Sandbox Code Playgroud)

-n选项关闭自动打印,因此该命令仅打印与模式匹配的行.(同样,默认情况下,sed使用基本正则表达式.).该-i.bak选项可以进行编辑,使用名称创建原始文件的备份file.bak.

如果你想选择用线条正好四根管道,你可以使用awk:

awk -F'|' 'NF==5' file > newfile
Run Code Online (Sandbox Code Playgroud)

将文件分隔符设置为管道符号,然后选择具有五个字段的行,即具有四个管道的行.

计算线条的有用工具是wc:

wc -l file
Run Code Online (Sandbox Code Playgroud)

会告诉你文件中有多少行; 如果算上在两行filenewfile的差额,显然是缺失的数量.你也可以在awk中进行计算,但它有点讽刺:

awk -F'|' 'NF==5{print;next}{del+=1}END{print del >>"/dev/stderr"}' file > newfile
Run Code Online (Sandbox Code Playgroud)