Como extrair o primeiro nome em ordem alfabética de vários arquivos

1

Digamos que eu tenha

Arquivo1:

Aaron
Vernon
Troy
Roy

Arquivo2:

Jason
Derek
Mariano
Alex

Eu quero mostrar:

File1: Aaron
File2: Alex

O que seria um comando bash de linha única que poderia fazer as duas coisas?

Eu estava pensando em usar sort e depois tail -1, mas isso só extrai de um arquivo de cada vez.

    
por Kylo Ren 29.05.2016 / 19:47

4 respostas

1

Com o GNU awk (que tem uma função de ordenação de array asort ) você poderia fazer

gawk '
  BEGINFILE{delete a}; 
  {a[FNR]=$0}; 
  ENDFILE{asort(a); print FILENAME": "a[1];}
' File1 File2
File1: Aaron
File2: Alex

Você pode escrever em uma única linha, se desejar

gawk 'BEGINFILE{delete a}; {a[FNR]=$0}; ENDFILE{asort(a); print FILENAME": "a[1];}' File1 File2
    
por 29.05.2016 / 20:52
1
for f in File* ; do
  printf "%s: %s\n" "$f" $(sort "$f" | head -n 1)
done

Saída:

File1: Aaron
File2: Alex
    
por 30.05.2016 / 04:24
0

Isso parece alcançar seu objetivo.

grep . File1 File2|sort -k 2,2 -t:|sed 's/:/: /g'
File1: Aaron
File2: Alex
File2: Derek
File2: Jason
File2: Mariano
File1: Roy
File1: Troy
File1: Vernon
    
por 29.05.2016 / 21:08
0

Para a pergunta original (uma linha de cada arquivo, nem todas as linhas são classificadas como você diz 'necessário'), e eficientes se os arquivos forem grandes (especialmente maiores que os da memória), se você tiver não-antigo GNU awk (a maioria dos Linuxes e alguns outros sistemas com bash ):

[g]awk -vx= 'FNR==1||$0<x {x=$0""} ENDFILE {print FILENAME": "x}' file1 file2 ...

Com o não-GNU awk (ou antigo gawk) você ainda pode fazer isso, mas é um pouco mais desajeitado:

[*]awk -vx= 'FNR==1&&NR!=1 {print f": "x} FNR==1||$0<x {f=FILENAME;x=$0""} END {if(NR) print f": "x}' file1 file2 ...
    
por 30.05.2016 / 04:10

Tags