Como esse script AWK funciona? -- and-line campo com unix camp apple Relacionado O problema

How does this AWK script work?


0
vote

problema

português

Eu tenho 2 arquivos de dados contendo uma coluna. Eu quero fazer outro arquivo de dados mesclando as duas colunas. Eu tenho a linha de comando na concha, mas não sei como funciona.

Por favor, explique elaboradamente o comando abaixo:

  awk 'NR==FNR {a[i++]=$0};              {b[x++]=$0;};{k=x-i};      END     {for(j=0;j<i;) print a[j++],b[k++]}'    file1.txt file2.txt    

Exemplo:

entrada:

  file1.txt    11 23 19 31 67 file2.txt 13 19 25 67 93    

Eu usei o comando acima para escrever um script shell e recebi a seguinte saída:

  11 13 23 19 19 25 31 67 67 93    

Eu quero saber como esta linha de comando está funcionando neste exemplo para dar a saída?

english

I have 2 data files each containing one column. I want to make another data file by merging both the columns. I have the command line in shell but I don't know how it works.

Please explain elaborately the below command:

awk 'NR==FNR {a[i++]=$0};              {b[x++]=$0;};{k=x-i};      END     {for(j=0;j<i;) print a[j++],b[k++]}' \   file1.txt file2.txt 

Example:

input:

file1.txt    11 23 19 31 67 file2.txt 13 19 25 67 93 

I used the command above to write a shell script and got following output:

11 13 23 19 19 25 31 67 67 93 

I want to know how this command line is working on this example to give the output?

     
       
       

Lista de respostas

1
 
vote

Bem, parte do aprendizado a usar o Unix é descobrir quais scripts existentes estão fazendo. Neste caso, você precisa saber um pouco sobre como awk funciona para entender o código. Eu vou me concentrar em descrever o awk parte, isso deve começar a descobrir o resto.

Basicamente ABCDEFGHIJKLMNABCDEFGHIJKLMN4 é um idioma de script acionado por padrões, onde os comandos consistem em um padrão / condição (pesquisa) e um bloco de código correspondente. Durante a execução, todos os arquivos de entrada são lidos da linha e se o padrão / condição for verdadeiro para uma linha, o bloco de código será executado. Há padrões especiais BEGIN e END que são usados ​​para acionar o código para ser executado antes a primeira linha ou após A última linha é lida.

No seu exemplo, você tem três linhas de padrão / código:

  NR==FNR {a[i++]=$0};    

NR e FNR são duas variáveis ​​especiais definidas por syntax on0 . Você pode procurar seu significado com syntax on1 para ver que

  syntax on2   

Então, basicamente, esta condição é verdadeira enquanto as linhas da primeira linha são lidas (o que significa que syntax on3 é executado uma vez para cada linha do primeiro arquivo) e false para todos os arquivos adicionais. syntax on4 é a linha atual de entrada.

  syntax on5   

Este bloco de código não tem condição / padrão para que seja executado para cada linha lida (de todos os arquivos, incluindo o primeiro).

  syntax on6   

Esta parte é executada após a última linha do último arquivo foi lida e processada.

Com esses princípios básicos, você deve ser capaz de descobrir o significado dos diferentes blocos de código e variáveis.

 

Well, part of learning to use Unix is to figure out what existing scripts are doing. In this case you need to know a bit about how awk works to understand the code. I will focus on describing the awk part, this should get you started in figuring out the rest.

Basically awk is a pattern-driven scripting language, where commands consist of both a (search) pattern/condition and a corresponding code block. During execution, any input files are read line by line and if the pattern/condition is true for a line, the code block is executed. There are special patterns BEGIN and END which are used to trigger code to get executed before the first line or after the last line is read.

In your example you have three pattern/code lines:

NR==FNR {a[i++]=$0}; 

NR and FNR are two special variables set by awk. You can look up their meaning with man awk to see that

NR     ordinal number of the current record FNR    ordinal number of the current record in the current file 

so basically this condition is true while lines from the first line are read (which means that a[i++]=$0 is executed once for each line from the first file) and false for all additional files. $0 is the current line of input.

        {b[x++]=$0;};{k=x-i}; 

This code block has no condition/pattern so it gets executed for every line read (from all files including the first one).

END     {for(j=0;j<i;) print a[j++],b[k++]}'  

This part runs after the last line of the last file has been read and processed.

With these basics you should be able to figure out the meaning of the different code blocks and variables yourself.

 
 
 
 

Perguntas relacionadas

0  Como esse script AWK funciona?  ( How does this awk script work ) 
Eu tenho 2 arquivos de dados contendo uma coluna. Eu quero fazer outro arquivo de dados mesclando as duas colunas. Eu tenho a linha de comando na concha, mas ...

0  Como posso adicionar um endereço de e-mail da Apple a um cliente de e-mail, como a evolução?  ( How can i add an apple email address to an email client such as evolution ) 
Eu de alguma forma acabei com um endereço de e-mail da Apple. Como posso usar o e-mail '@ me.com' no meu cliente de e-mail (evolução no debian)? ...

2  Quais ferramentas existem para recuperar um arquivo que eu mudo usando o CPP no terminal?  ( What tools exist to recover a file i clobbered using cpp in terminal ) 
Eu acidentalmente digitado cpp Scriptname.py DestinationDirectory , com a intenção de copiar o script Python para a pasta. Eu percebi depois que eu deveria...

0  Obtendo .Profile para executar após .bash_login  ( Getting profile to execute after bash login ) 
Quando eu instalei o RVM, descobri que criou .bash_login com este: [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a s...

0  Não é possível inicializar para MacOS depois de redimensionar a partição MacOS  ( Cant boot to macos anymore after resizizing macos partition ) 
Depois de instalar o Ubuntu como um segundo sistema no meu MacBook após este tutorial https : //www.maketechease.com/install-dual-boot-ubuntu-mac/ Tudo esta...

3  MacBook Pro preso no loop de inicialização - modo de recuperação e modo de segurança não funcionando  ( Macbook pro stuck in boot loop recovery mode and safe mode not working ) 
Eu tenho um MacBook Pro 2015 (8 GB RAM, executando MacOS Mojave) preso na tela de carregamento com o logotipo da Apple e a barra de carregamento 100% concluíd...

5  Por que "echo" "em / etc / bashrc causa o scp?  ( Why does echo in etc bashrc cause scp to hang ) 
Eu estou copiando diretórios de uma máquina de Snow Leopard para uma máquina de tigre usando scp -r e por algum motivo, parece que a linha final do alvo (ti...

3  Números de saída de teclas de seta Ao conectar o hóspede do Ubuntu Virtualbox no host Windows 7 via conexão de área de trabalho remota  ( Arrow keys output numbers when connecting to ubuntu virtualbox guest on windows ) 
Eu tenho um convidado Ubuntu em execução no host do Windows 7. Eu então queria me conectar remotamente do meu MacBook Air na cama, e assim acessei a VM via cl...

3  Abrindo uma imagem de disco OS X com um agente de lançamento enquanto a exibição está dormindo  ( Opening an os x disk image with a launchd agent while the display is sleeping ) 
Eu criei um abcdefghijklmnlaunchd agente que abre uma imagem de disco esparsa protegida por senha (e monta seu volume solitário) diariamente às 2h45 em prep...

26  Como posso inspecionar as variáveis ​​de ambiente de um processo de execução?  ( How can i inspect the environment variables of a running process ) 
Existe algum equivalente (CLI ou GUI) para o recurso ABCDefGHIJKLMNABCDefGHIJKLMN0 ...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.