awk
é uma ferramenta melhor para comparar colunas de arquivos. Veja, por exemplo, a resposta para: compare duas colunas de arquivos diferentes e imprima se corresponder a - existem respostas semelhantes para imprimir linhas de colunas correspondentes.
Como você deseja imprimir linhas que não correspondam, podemos criar um comando awk
que imprime as linhas no arquivo2 para as quais a coluna 2 não tem visto no arquivo1:
$ awk 'NR==FNR{c[$2]++;next};c[$2] == 0' file1 file2
Another 193 stuff2
Another 783 stuff3
Como explicado de forma semelhante por terdon em a questão acima mencionada ,
-
NR==FNR
: NR é o número da linha de entrada atual e FNR o número da linha do arquivo atual. Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. -
c[$2]++; next
: se este for o primeiro arquivo, salve o segundo campo na matrizc
. Em seguida, pule para a próxima linha para que isso seja aplicado apenas no primeiro arquivo. -
c[$2] == 0
: o bloco else só será executado se este for o segundo arquivo, então checamos se o campo 2 deste arquivo já foi visto (c[$2]==0
) e se foi, imprimimos a linha. Emawk
, a ação padrão é imprimir a linha, portanto, sec[$2]==0
for true, a linha será impressa.
Mas você também quer as linhas do arquivo1 para as quais a coluna 2 não corresponde no arquivo2. Isso você pode obter simplesmente trocando sua posição no mesmo comando:
$ awk 'NR==FNR{c[$2]++;next};c[$2] == 0' file2 file1
Something 456 item2
Something 768 item3
Agora, você pode gerar a saída desejada, usando awk
duas vezes. Talvez alguém com mais awk
de especialistas possa fazê-lo de uma só vez.
Você marcou sua pergunta com /ksh
, então presumo que esteja usando o shell korn. Em ksh
você pode definir uma função para seu diff, digamos diffcol2
, para facilitar seu trabalho:
diffcol2()
{
awk 'NR==FNR{c[$2]++;next};c[$2] == 0' $2 $1
awk 'NR==FNR{c[$2]++;next};c[$2] == 0' $1 $2
}
Isso tem o comportamento que você deseja:
$ diffcol2 file1 file2
Something 456 item2
Something 768 item3
Another 193 stuff2
Another 783 stuff3