linux - 在管道定界符的基础上传递字符串/记录

标签 linux unix

请告知,因为我有记录列表,但我需要查明我的记录是否有 5 个竖线分隔符和名字匹配,然后打印它。

例如:

abc|def|ghi|lmno|pq|rs
abc|def|ghi|lmno
abc|def|ghi
dpo|def|ghi|lmno|fr|pl|nm

但如果循环,我只想传递第一个值。

if ($string contains "abc" && 5 pipe delimiter )
print $string;

最佳答案

看起来 awk 再次出手相助:

awk -F '|' 'NF == 6 && $1 == "abc" { print }'

如果有5个分隔符,则有6个字段。您可以省略 { print } ,因为这是默认操作。如果您需要将值 abc 传递给脚本(它可能会有所不同),请使用:

awk -F '|' -v string=abc 'NF == 6  && $1 == string { print }'

不要尝试使用 match 作为变量名。

我的回答是基于这个问题,它说:

if my record has 5 pipe delimiter and first name matches then print it

意思是“如果记录有 6 个由管道分隔符分隔的字段(因此有 5 个管道)并且第一个字段与给定名称匹配,则打印整个记录”。如果问题的含义略有不同,则必须相应地修改答案。

这是 Unix;还有其他方法可以完成相同的任务,包括:

grep '^abc|[^|]*|[^|]*|[^|]*|[^|]*|[^|]*$'
sed -n -e '/^abc\(|[^|]*\)\{5\}$/p'

您可以使用 Perl 或 Python,或者……选择您最喜欢的脚本语言。但是,awk 解决方案比 grepsed 解决方案更易于阅读。

关于linux - 在管道定界符的基础上传递字符串/记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24359212/

相关文章:

php - 2>&1 在此 php 代码段中做什么?

linux - 使用 expr 实用程序在 Linux 中进行浮点运算

c - waitpid() 不等待 child

unix - 调整图像大小(jpeg 或解压缩图像)

linux - 如何正确处理 bash shell 脚本中的通配符扩展?

linux - app->start之后怎么办;在 Perl 的 Mojolicious websocket 中

linux - 在值中存储 grep 时的额外反斜杠

linux - 在 Linux 中自动重复命令

linux - 我如何在 Linux 中创建多级软链接(soft link)或者可以这样做吗?

linux - awk - 非重复值表