Как использовать несколько разделителей отдельно в awk

Начиная с основ, у меня есть файл с номером, одним или несколькими пробелами, а затем именем файла (включая путь). Имя файла и путь также могут содержать пробелы.

Я хочу использовать awk для разделения и использования компонентов в дальнейших тестах на равенство между этими полями в отдельных файлах.

Имея дело только с первой проблемой, это файл:

111  aaa/aaa
222  b b/bbb
333  ccc/c c
444  d d/d d

Я хотел бы видеть результат:

aaa/aaa 111
b b/bbb 222
ccc/c c 222
d d/d d 222

Суть здесь не в формате вышеприведенного вывода, а в возможности использовать $ 1 , $ 2 и $ 3 далее в выражении awk после установки этих переменных. Хотя здесь всего один файл, я действительно сравниваю два набора файлов, но сначала нужно разобраться с этим компонентом.

$ 1 должен содержать буквенно-цифровую последовательность в начале строки, $ 2 должен содержать полный путь (без имени файла), а $ 3 должен содержать только имя файла

Я пытался изменить FS во время программы, но у меня этого просто не произошло:

$ awk 'BEGIN{OFS=" || "}{FS=" ";a[$1]=1;FS="/";b[$NF]=1;print $1, $2, $NF}' file1
111 || dir1/a || aa
222 dir1 || bbb || bbb
333 dir1 || c cc || c cc
444 dir1 || ddd || ddd
555 dir2 || e ee || e ee
666 dir2 || fff || fff
999 dir2 || zzz || zzz

Не только FS убирая косую черту, первая переменная просто неверна, потому что она использует только вторую FS

0
12.04.2017, 02:42
2 ответа
while read -r f1 fpath; do
   printf '%s\t%s\n' "$fpath" "$f1"
done < file1

Я не уверен, что вам нужно, но вы делаете это намного сложнее, чем нужно.

Результат:

aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444
0
28.01.2020, 02:46

Я не очень понимаю, зачем вам это нужно, но вы могли бы (например) сохранить и удалить однозначно разделенный пробелом $1, а затем разделить остаток используя альтернативный разделитель. Например:

$ awk '
   {
      a=$1; $1=""; sub(/^ */,""); 
      n=split($0,p,"/"); 
      $1=a; for(i=1;i<=n;i++) $(i+1) = p[i]
   } {
     print $2"/"$3, $1
   }' file
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444
1
28.01.2020, 02:46

Теги

Похожие вопросы