在文件中的一对多位置查找特定字符

在文件中的一对多位置查找特定字符

我正在寻找一种方法来迭代固定格式文本文件,并在文件中的任何数据行内的一个到多个特定字符位置(包括第一个字符位置)中查找特定字符。如果这些位置中的任何一个符合字符标准,我想输出该记录/行。有人有 grep 或 awk 命令可以做到这一点吗?例如,如果我要在文件 X 的位置 5、10 或 25 中查找星号 (*),那么在 awk 或 grep 中如何完成?文件示例

     cat test.txt
    *   *    *
    *   X    *
    *   *    Y
    *   X    Y

答案1

grep '^\(.\{4\}\|.\{24\}\)\*' X

查找文件 X 中包含星号(用引号引起来,因为否则在正则表达式中表示零个或多个前面的原子)的所有行,该星号前面距行开头 4 或 24 个字符。

答案2

也许下面这awk行会帮助你更好地理解它

printf '%s\n' "foo bar *" foo "more foo * more * foo and baz" "another foo bar foo" | awk '{for (i=1;i<=NF;i++) if ($i=="*") print $i " appears in field: " i}'

就像遍历字段、将字段与模式匹配并将其打印出来一样简单

答案3

至少使用gawkmawk,您可以通过设置空字段分隔符将每个字符视为一个字段。例如你可以这样做

gawk -F '' '$5 == "*" || $10 == "*"' test.txt

这会导致使用默认打印规则打印匹配的记录(行)。

类似的技巧perl(注意字段是零索引的)

perl -F'' -ane 'print if $F[4] eq "*" || $F[9] eq "*"' test.txt

相关内容