awk:保留多个字段分隔符

时间:2015-05-12 17:26:11

标签: bash awk separator

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

示例:

我想改变这个:

/路径/到/的 example_file _123.txt

进入这个:

/路径/到/的 file_example _123.txt

我试过了:

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

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

path to file example 123.txt

我尝试过保留字段分隔符:

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

但我明白了:

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

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

3 个答案:

答案 0 :(得分:1)

这是一个解决方案:

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

答案 1 :(得分:1)

您可以随时使用Perl。

假设:

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

然后:

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

答案 2 :(得分:0)

$ cat /tmp/1
/path/to/example_file_123.txt
/path/to/example_file_345.txt

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