verificar se nenhuma linha contém string em determinado campo [closed]

0

Eu preciso procurar por milhares de strings, uma a uma, se elas existirem em uma segunda coluna e, se não, fizer uma ação contra cada string que não foi encontrada na segunda coluna de qualquer linha

arquivo

:

line a
line b
line c
line z
line d
line e
line z
line z

arquivo2:

line a
line b
line c
line d
line e

O que eu tentei:

$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file
3 "z"
$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file2
no "z"
$ awk '{if($2=="z") {c++} } END { if(c!=0) {print "no \"z, action will be done\""} }' file
no "z, action will be done"

O meu código está ok ou pode ser simplificado / otimizado ainda?

Atualização: @RomanPerekhrest referindo-se ao seu código, como processar apenas "else" ou adicionar negação a "c" e depois ignorar mais?

Eu estava tentando com: (c?: "não"),

mas não funciona.

@ αғsнιη, obrigado, finalmente tenho script de trabalho

$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file2
$

ou

$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file2
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file
$
    
por DonJ 15.03.2018 / 16:15

2 respostas

1

Via awk variável dinâmica / argumento -v <var>=<value> :

Caso de teste para a string z :

awk -v s="z" '$2==s{ c++ }END{ printf "%s 2%s2\n", (c? c : "no"), s }' file

A saída:

3 "z"

Caso de teste para a string w :

awk -v s="w" '$2==s{ c++ }END{ printf "%s 2%s2\n", (c? c : "no"), s }' file

A saída:

no "w"
    
por 15.03.2018 / 16:22
0

Se eu entendi isso corretamente, você quer verificar se a segunda coluna tem um alfabeto específico, se sim, então tente abaixo do script awk , que informará qual deles existe com a contagem correspondente e qual não possui com "NOT FOUND!" observação.

awk -v alphabet="$(printf "%s" {a..z})" 'BEGIN{ split(alphabet, arr, "") }
    { chrs[$2]++ } END{ for(y in chrs) for(x in arr)
        { if(arr[x] in chrs) {print y, chrs[y]; delete arr[x]; break }
            else{ print arr[x]" NOT FOUND!"; delete arr[x] }
        }
}' infile

Saída:

w 1
z 3
a 1
b 1
c 1
f NOT FOUND!
g NOT FOUND!
h NOT FOUND!
i NOT FOUND!
j NOT FOUND!
k NOT FOUND!
l NOT FOUND!
m NOT FOUND!
n NOT FOUND!
o NOT FOUND!
p NOT FOUND!
q NOT FOUND!
r NOT FOUND!
s NOT FOUND!
t NOT FOUND!
u NOT FOUND!
v NOT FOUND!
d 1
x NOT FOUND!
y NOT FOUND!
e 1
    
por 15.03.2018 / 18:34