![列中匹配字符串的列号](https://linux22.com/image/155161/%E5%88%97%E4%B8%AD%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%97%E5%8F%B7.png)
我知道这看起来很简单,但我无法让它工作或找到功能选项。
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
使用tr
和grep
:
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