2015-05-12 4 views
1

Я использую awk для обмена полями в имени файла, используя два разных разделителя полей. Я хочу знать, можно ли сохранить оба разделителя '/' и '_' в правильных положениях на выходе.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, когда вы работаете с несколькими разделителями?

+2

Не используйте несколько разделителей полей. Используйте '/' в качестве разделителя полей, а затем используйте 'split()' для разделения части имени файла. – Barmar

+2

Ваши выбранные поля также очень не работают в ваших сценариях. Не говоря уже о том, что ваш первый и второй сценарии здесь идентичны (я предполагаю, что вы забыли «BEGIN {OFS = FS}» или что-то в этом примере во втором примере? –

+0

Могу ли я передать его для разделения? Я думал, что split только разбивает фактический файл на части (в отличие от имени файла) –

ответ

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 
+0

Пожалуйста, объясните также. – Prudhvi

+1

в основном используя '_' в качестве разделителя полей, затем с помощью split, чтобы получить последнее поле 'example' в [2]. remove 'example' from $ 1 using gsub и распечатывать все по мере необходимости с помощью печати – VenkatC

+0

Это приведет к сбою с такими строками, как '/ path/to/example_file_more_123.txt', поскольку вы предполагаете, что всегда будет только два символа подчеркивания' _' – Jotne

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

Вы всегда можете использовать Perl.

Дано:

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

Тогда:

$ echo $e | perl -ple 's/([^_\/]+)_([^_\/]+)/\2_\1/' 
/path/to/file_example_123.txt 
Смежные вопросы