Esta foi a minha linha de comando original:
awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' file1 file2
Isso está localizado dentro de um script bash e eu originalmente imprimo cada seção em um arquivo e, na próxima linha, usei esse arquivo como entrada. No entanto, agora estou mudando para o uso de variáveis e cheguei a esta linha e estou preso por causa da entrada dupla.
Então, eu não estou mais tentando alimentar arquivos para o awk, estou querendo alimentar variáveis.
Se eu estivesse lidando com uma variável, sei que faria:
echo "$var1" | awk '{$1=$2=""; print $0}'
Mas não consigo encontrar um exemplo de como passar uma segunda variável / stream para o awk enquanto estiver em um script bash.
exemplos que eu tentei:
awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$var1" "$var2"
echo "${var1}" | awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "${var2}"
awk -v s1="$var1" -v s2="$var2" 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$s1" "$s2"
editar:
Para alguns contextos, esta é uma versão muito simplificada, mas eu tenho um conjunto de arquivos assim:
:~/test$ ls -lR ?/file*
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 1/file.0
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:04 1/file.1
-rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.2
-rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.3
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.1
-rw-rw-r-- 1 madivad madivad 10 Apr 19 23:06 2/file.3
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.4
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 2/file.5
Eu também tenho dois arquivos de auditoria que contêm os resultados de um hash de cada estrutura de diretórios que pode abranger profundamente e contém 500MB + de dados cada.
Na linha de comando eu escrevi várias ferramentas para procurar por dupes, tipo de idade e tamanho, encontrar arquivos que estão faltando, etc. Estou tentando automatizar mais o processo e tê-lo contido em um arquivo de lote. Eu já coloquei tudo em um arquivo de lote e usei o disco rígido como um local de rascunho, ou seja, salvei cada saída no disco rígido como um arquivo, e a próxima linha de lote carrega esse arquivo e continua. Meu objetivo é se livrar de todos os arquivos supérfluos.
A estrutura do arquivo está no padrão hashdeep
output, mas eu já o manipulei para conter apenas uma string fixa de hashes, alguns espaços e, em seguida, o caminho completo e o nome do arquivo. Começa assim:
~/test$ head 2/audit?
==> 2/audit1 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/1
## $ hashdeep -l file.0 file.1 file.2 file.3
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.0
8,736e5da8b598eec84d4ec0e1be63b6d1,eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2,file.2
8,e487aeec573e0936c1ac9f091130c20b,1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f,file.3
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
==> 2/audit2 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/2
## $ hashdeep -l file.1 file.3 file.4 file.5
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.5
6,9e87b0fde0cf6b641bd4a27aee5f5536,247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361,file.4
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
10,b7b9e4419c0708f401d45f061ac9a231,fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52,file.3
e quando chego ao processamento de awk
eu já o tenho assim:
~/test$ head 2/so*
==> 2/sort1 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.0
736e5da8b598eec84d4ec0e1be63b6d1eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2 file.2
e487aeec573e0936c1ac9f091130c20b1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f file.3
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1
==> 2/sort2 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.5
b7b9e4419c0708f401d45f061ac9a231fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52 file.3
9e87b0fde0cf6b641bd4a27aee5f5536247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361 file.4
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1
Com a linha específica que estou tentando executar de acordo com essa pergunta, esperaria que a entrada acima emitisse o nome do arquivo $2
apenas se o nome do arquivo aparecesse nos dois arquivos, mas os hashes a[$2] and
$ 1 'não jogo.
Portanto, para a entrada acima, esperaria apenas ver:
file.3