列中匹配字符串的列号

列中匹配字符串的列号

我知道这看起来很简单,但我无法让它工作或找到功能选项。

Linux UBUNTU 操作系统,bash 脚本

我需要根据字符串识别列号(总是有不同数量的列要搜索)

输入示例:

STRING="Boo"
Hi Boo Jiggy

示例输出:

2

答案1

使用 awk:

$ string=Boo
$ echo 'Hi Boo Jiggy' | awk -v b="$string" '{for (i=1;i<=NF;i++) { if ($i == b) { print i } }}'
2

我们将您的搜索字符串作为 awk 参数传递,然后循环遍历输入中的每个字段。如果当前字段等于搜索参数,我们将打印它的编号。

注意:这将找到多个字符串(如果存在),但不适用于子字符串。

答案2

使用trgrep

string=Boo
echo "Hi Boo Jiggy" | tr ' ' '\n' | grep -nw "$string" | cut -d':' -f1

请注意,与 @Jesse 的版本不同,此变体不支持线路感知。所以,

echo 'Hi
Boo Jiggy' | tr ' ' '\n' | grep -nw "$string" | cut -d':' -f1

将输出 2,而 @Jesse 的版本将输出 1。
我不知道这对你来说是否重要。

答案3

我刚刚将解决方案放入脚本中。也许您发现它有帮助:

#!/bin/sh

[ -z "$1" ] && exit 0

value="$(head -n1 "$1" | grep -Eo '".*"')"
column="$(sed '1d' "$1" | awk '{ for (i=1;i<=NF;i++) if ($i == '$value') print i }')"

echo "Column: $column"

例子:

yurij@opensuse-leap65:~/trash/awk> cat example.txt 
String="Boo"
Hi Boo Jiggy

yurij@opensuse-leap65:~/trash/awk> ./process.sh ./example.txt 
Column: 2

答案4

使用(以前称为 Perl_6)

~$ echo "Hi Boo Jiggy Boo" | raku -ne 'put .words.grep(/Boo/, :k);'
1 3

上面的输入来自STDIN并使用正则表达式匹配器Boo。 Raku 代码逐行返回每个匹配项的空格分隔列(返回中的空行指示行上没有匹配项)。

返回匹配的零索引列。 (要返回单索引列,请添加.map(* + 1)到代码末尾)。如果您想从 Raku 代码中抽象出字符串,请将其声明为环境变量:

~$ echo "Hi Boo Jiggy Boo" | env string="Boo" raku -ne 'put .words.grep(/<{ %*ENV<string> }>/, :k)'
1 3

也适用于文件:

~$ env string="Boo" raku -ne 'put .words.grep(/<{ %*ENV<string> }>/, :k)' Hi_Boo_Jiggy_Boo.txt
1 3

最后,如果您确定每行只有一个匹配项——或者您只想返回第一个匹配列——那么请在代码末尾添加索引.[0](或)。[0]

https://www.nntp.perl.org/group/perl.perl6.users/2020/07/msg9004.html
https://raku.org

相关内容