Estou usando o shell bash. Se eu tiver um arquivo de números de linha
1
4
7
9
e outro arquivo de linhas onde o primeiro elemento é um número seguido por uma string de texto
1,Michael Jordan
2,Karl Malone,
3,Charles Barkley
4,Greg Anthony
5,Chris Mullen
6,Reggie Miller
7,Billy Owens
8,David Robinson
9,Shaquille O'Neal
10,John Stockton
Como escrevo um awk
comando para extrair linhas do segundo arquivo somente se o primeiro número pertencer ao primeiro arquivo? No exemplo acima, eu esperaria esse resultado
1,Michael Jordan
4,Greg Anthony
7,Billy Owens
9,Shaquille O'Neal
eu tentei isso
awk 'FNR==NR{a[$1];next} $1 in a' /tmp/first_file /tmp/second_file > /tmp/third_file
mas não produz nada no terceiro arquivo.
Como seu segundo arquivo é separado por vírgula, você precisa definir o separador de campo awk para
,
- globalmente usando a-F
opção de linha de comando:ou através da
FS
variável incorporada:O último método permitiria lidar com o caso em que o primeiro arquivo não é delimitado por vírgula (e tem mais de um único campo).
Usando Raku (anteriormente conhecido como Perl_6)
Raku é uma linguagem de programação da família Perl. Como você
BEGIN
, pegue a lista de números e armazene em uma matriz,@a
. Os-ne
sinalizadores então lêem os arquivos da linha de comando sem impressão automática (awk
comportamento semelhante a).Aqui, a linha é lida na variável de tópico (
$_
), que estásplit
entre vírgulas, e o primeiro elemento ([0]
) é obtido. Esses elementos são comparados usando o==
operador de igualdade numérica (primeiro exemplo de código) ou~~
o operador de correspondência inteligente de Raku. No RHS do operador, a@a
matriz é transformada em umaany()
junção. Aif
saída condicionalput
é a linha se a condição for satisfeita.Exemplo de entrada:
Saída de amostra (usando um
nbr_list.txt
arquivo que consiste em 1,4,7,9):As junções são interessantes porque se encadeiam automaticamente. Para o problema indicado acima, uma
one()
junção também funciona e pode até ser mais eficiente.Uma abordagem alternativa usa Sets: os números de linha são transformados em um
Set
deInt
s. Os dados são lidos em linha, cada primeira coluna é forçada para umInt
, e verificada para ver se é um(elem)
elemento do conjunto. Observe que infix(elem)
ou infix∈
, (o símbolo Unicode) pode ser usado no código abaixo:https://docs.raku.org/type/Junction
https://docs-stage.raku.org/type/Junction
https://raku.org