我有这一行,但我希望将其每个部分分开,并且我希望使用 awk 来完成此分离。
原始行如下:
3302491505_8139829707_13970101.csv
我想要的输出是:
8139829707
或这个:
3302491505
答案1
这可以通过 cut 来完成:
$ cut -d_ -f2 <<< "3302491505_8139829707_13970101.csv"
8139829707
答案2
尝试这个:
awk -F'[_.]' '{print $2; print $1}' <<< "3302491505_8139829707_13970101.csv"
-F
将字段分隔符设置为_
或.
。它允许设置字段$1
和$2
。
答案3
这将单独打印所有部件
$ awk -F'[_.]' '{print $1; print $2; print $3; print $4}' <<< "3302491505_8139829707_13970101.csv"
3302491505
8139829707
13970101
csv
只需使用您想要的字段即可。
$ awk -F'[_.]' '{ print $3;}' <<< "3302491505_8139829707_13970101.csv"
13970101
答案4
类似 Bourne 的 shell 有一种内置的分割字符串的方法。这就是当您不加引号的参数扩展时会发生的情况,并且当您不希望这种情况发生时会产生如此多的错误。
因此,只有在实际需要时才使用它似乎才公平。
IFS=_ # split on _
set -o noglob # leaving a parameter expansion unquoted also
# involves filename generation which we don't want here
var=3302491505_8139829707_13970101.csv
set -- $var # $var unquoted means its split
printf '%s: %s\n' First "$1" Second "$2" Third "$3"
有些 shell 有不太麻烦的分割字符串的方法。
在zsh
:
var=3302491505_8139829707_13970101.csv
non_empty_parts=(${(s:_:)var})
parts=("${(@s:_:)var}")
或者直接:
printf '%s\n' "Second part: ${${(s:_:)var}[2]}"