英文:
awk oneliner provide this error "awk: line 1: syntax error at or near ,"
问题
echo "24_02_2022.rar" | awk '{match($0,/.+_(.+).rar/,a); print a[1]}'
我想从字符串中提取年份。
英文:
Can someone tell me why this simple awk command gives the above error
echo "24_02_2022.rar" | awk '{match($0,/.+_(.+).rar/,a); print a[1]}'
I would like to extract the year from a string
答案1
得分: 3
使用GNU的match
函数,其中的array参数是gawk的扩展。
在awk
中的一个选项是将字段分隔符设置为.
和_
,然后匹配字符串末尾的最后一个下划线后跟.rar
。
然后打印倒数第二个字段。
echo "24_02_2022.rar" | awk -F"[._]" '/_[^_]*\.rar$/ {print $(NF-1)}';
输出:
2022
英文:
Using the gnu match function with the array argument:
> The array argument to match() is a gawk extension.
One option with awk
could be setting the field separators to .
and _
and then match the last underscore followed by .rar
at the end of the string.
Then print the second to last field.
echo "24_02_2022.rar" | awk -F"[._]" '/_[^_]*\.rar$/ {print $(NF-1)}'
Output
2022
答案2
得分: 2
echo "24_02_2022.rar" | awk -F "[_.]" '{print $3}'
的输出是 2022
。
英文:
How about a simple echo "24_02_2022.rar" | awk -F "[_.]" '{print $3}'
?
Output:
2022
答案3
得分: 1
以下是翻译好的部分:
IFS=._ read -ra a <<< "24_02_2022.rar"
echo "${a[-2]}"
英文:
A pure bash solution, assuming the bash version used is greater than or equal to 4.2, could be
IFS=._ read -ra a <<< "24_02_2022.rar"
echo "${a[-2]}"
答案4
得分: 1
以下是翻译好的部分:
"24_02_2022.rar" | gawk '{match($0,/.+_(.+).rar/,a); print a[1]}';
如果这不起作用,并且出现 gawk 不存在的投诉,请尝试安装(如果您使用的是流行的发行版,您的系统可能默认包管理器中提供了它)。如果不允许安装,您的解决方案可能可以转移到 GNU sed
,如下所示:
"24_02_2022.rar" | sed 's/._(..).rar.*/\1/';
但请注意,与 GNU AWK
中使用的正则表达式相比,我添加了尾随的 .*
以删除后面的字符(如果有的话)。
(在 GNU sed 4.7 中测试过)
英文:
As already pointed you need to use GNU AWK
, firstly try
echo "24_02_2022.rar" | gawk '{match($0,/.+_(.+).rar/,a); print a[1]}'
if that does not work and you get complaint that gawk is not present try installing (if you are using popular distro there is good chance it is available in default packaging manager of your system), if you are not allowed to install your solution might be ported to GNU sed
following way
echo "24_02_2022.rar" | sed 's/.*_\(..*\).rar.*//'
However keep in mind that all dotes match any character including that before rar
, if this is not what you want then use
echo "24_02_2022.rar" | sed 's/.*_\(..*\)[.]rar.*//'
Observe that in comparison to regular expression used in GNU AWK
I added trailing .*
to remove following characters if any.
(tested in GNU sed 4.7)
答案5
得分: 0
在这种特殊情况下,可能最简单的方式是
basename '24_02_2022.rar' .rar
这将返回
24_02_2022
<details>
<summary>英文:</summary>
In this particular case, probably the simplest way is
basename '24_02_2022.rar' .rar
that returns
24_02_2022
</details>
# 答案6
**得分**: 0
无需依赖`match()`函数的第三个参数:
```shell
echo "24_02_2022.rar" |
> gawk -F'_' '{ print substr($NF,++_,-_+index($NF,".")) }' # 太啰嗦
— 或
> nawk 'NF+=OFS=_' FS='^.+_|.rar'
> mawk NF=NF OFS= FS='^.+_|.rar' # 稍微短一点
— 或
> mawk 'gsub("^.+_|.rar",_)^_ ' # 最简洁的方式
2022
如果你愿意赌一下没有空行,那么:
> mawk -F'[_.]' '$!NF=$--NF' FS=
> gawk -F'[_.]' '$_=$--NF'
或者一种非常特殊的方式:
> nawk NF RS='.+_|[.].+'
2022
英文:
absolutely no need to rely on that 3rd argument for match()
:
echo "24_02_2022.rar" |
> gawk -F'' '{ print substr($NF,++,-+index($NF,".")) }' # too verbose
— or
> nawk 'NF+=OFS=' FS='^.+|.rar'
> mawk NF=NF OFS= FS='^.+|.rar' # shorter by tiny bit
— or
> mawk 'gsub("^.+|.rar",)^_' # most succinct
2022
If you wanna gamble there aren't empty lines, then :
> mawk -F'[.]' '$!NF=$--NF' FS=
> gawk -F'[.]' '$_=$--NF'
or a VERY fringe way of doing it :
> nawk NF RS='.+_|[.].+'
2022
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论