Ik heb dit bestand
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
En ik wil de exacte string 200 matchen met awk
. Dus mijn resultaat zou moeten zijn
a deiauk Biking US 200 G
Hier is mijn code
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Maar daarna dat ik alle regels heb.
Reacties
Answer
Aangezien u een exacte overeenkomst wilt, kunt u ==
gebruiken?
$ cat >file a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z a auie auie 200 B b nrst nrst 200 C $ awk "$(NF-1)==200{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Je kunt je match ook beperken met /^200$/
:
$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Bewerken:
Ik heb je commando geprobeerd, en het zou moeten werken. Weet je zeker van je -F " "
?
Comm ents
- Ja
-F ' '
is prima in mijn beschrijving. Ik weet niet ' waarom, maar ik heb nog steeds hetzelfde probleem
Antwoord
Met awk
, alleen:
awk "$0~/ 200 /" file
Of sed
(\s
komt overeen met elke witruimte):
sed -n "/\s200\s/p" file
A grep
oplossing (-P
voor perl regex):
grep -P "\s200\s" file
Als het puur moet zijn bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Als u “niet zeker weet of er spaties, tabs of wat dan ook zijn ([[:space:]]
is als \s
, in de sed
en grep
oplossingen hierboven ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Reacties
- In
grep
het werkt ook zonder-P
,grep '\s200\s' file
Antwoord
Ik denk van wel s zullen helpen. Hierdoor wordt alleen de regel met het patroon afgedrukt. In jouw geval is het patroon 200
grep "200" file-name
awk
code een enkele regel? Heb je zelfs de moeite genomen om te begrijpen wat dit moet doen?