我正在寻找一种方法来迭代固定格式文本文件,并在文件中的任何数据行内的一个到多个特定字符位置(包括第一个字符位置)中查找特定字符。如果这些位置中的任何一个符合字符标准,我想输出该记录/行。有人有 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
至少使用gawk
和mawk
,您可以通过设置空字段分隔符将每个字符视为一个字段。例如你可以这样做
gawk -F '' '$5 == "*" || $10 == "*"' test.txt
这会导致使用默认打印规则打印匹配的记录(行)。
类似的技巧perl
(注意字段是零索引的)
perl -F'' -ane 'print if $F[4] eq "*" || $F[9] eq "*"' test.txt