如何使用 awk 分割包含下划线的行?

如何使用 awk 分割包含下划线的行?

我有这一行,但我希望将其每个部分分开,并且我希望使用 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]}"

相关内容