awk:保留多个字段分隔符

awk: Preserve multiple field separators

我正在使用 awk 使用两个不同的字段分隔符交换文件名中的字段。 我想知道是否可以在输出的正确位置保留两个分隔符“/”和“_”。

示例:

我想改变这个:

/path/to/example_file_123.txt

进入这个:

/path/to/file_example_123.txt

我试过:

awk -F "[/_]" '{ t=; =; =t;print}' file.txt

但输出中缺少字段分隔符:

path to file example 123.txt

我试过保留字段分隔符:

awk -F "[/_]" '{t=; =; =t; OFS=FS; print}' file.txt

但我明白了:

[/_]path[/_]to[/_]file[/_]example[/_]123.txt

当您处理多个分隔符时,有没有办法在 awk 中保留正确的原始字段分隔符?

这是一种解决方案:

awk -F/ '{n=split($NF,a,"_");b=a[1];a[1]=a[2];a[2]=b;$NF=a[1];for (i=2;i<=n;i++) $NF=$NF"_"a[i]}1' OFS=/ file
/path/to/file_example_123.txt
$ cat /tmp/1
/path/to/example_file_123.txt
/path/to/example_file_345.txt

$ awk -F'_' '{split(,a,".*/"); gsub(a[2],"",);print "_"a[2]"_"}' /tmp/1
/path/to/file_example_123.txt
/path/to/file_example_345.txt

您可以随时使用 Perl。

鉴于:

$ echo $e
/path/to/example_file_123.txt

然后:

$ echo $e | perl -ple 's/([^_\/]+)_([^_\/]+)/_/'
/path/to/file_example_123.txt