Como usar vários delimitadores separadamente no awk

0

Começando com o básico, eu tenho um arquivo que tem um número, um ou mais espaços, então um nome de arquivo (incluindo o caminho). O nome do arquivo e o caminho podem conter espaços também.

Eu quero usar awk para separar e usar os componentes em testes adicionais sobre a igualdade entre esses campos em arquivos separados.

Lidando apenas com o primeiro problema, este é o arquivo:

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

Eu gostaria de ver como a saída:

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

A essência aqui não é o formato da saída acima, mas sim a possibilidade de usar $1 , $2 e $3 na expressão awk após essas variáveis terem sido definidas. Embora aqui seja apenas um arquivo, eu estou realmente comparando dois conjuntos de arquivos, mas preciso me concentrar primeiro nesse componente.

$1 deve conter a sequência alfanumérica no início da linha, $2 deve conter o caminho inteiro (sem o nome do arquivo) e $3 deve conter apenas o nome do arquivo

Eu tentei alterar o FS durante o programa, mas isso não está acontecendo comigo:

$ 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

Não apenas o FS está removendo a barra, como a primeira variável está errada porque está usando apenas o segundo FS

    
por Madivad 12.04.2017 / 01:42

2 respostas

1

Eu realmente não entendo por que você precisa fazer isso, mas você pode (por exemplo) salvar e remover o $1 sem delimitar o espaço e dividir o restante usando o delimitador alternativo. Por exemplo:

$ 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
    
por 12.04.2017 / 04:29
0
while read -r f1 fpath; do
   printf '%s\t%s\n' "$fpath" "$f1"
done < file1

Não sei ao certo o que você está procurando, mas você está tornando isso muito mais complexo do que precisa ser.

Resultado:

aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444
    
por 12.04.2017 / 07:03

Tags