LINUX.ORG.RU

bash сравнение первых строк текстов


0

2

подскажите как решить задачку. В каталоге находится несколько текстовых файлов. Предполагая, что в первой строке располагается текст заголовка, получить список документов в заголовке которых встречается ключевое слово.

Я знаю как искать оидинаковые слова во всем тексте, но как только в первой строке не могу додуматься

Делайте то же самое, но с $(head -n1 <file>).

AITap ★★★★★ ()
$ echo '111
> 222' |awk 'FNR==1 && /111/ {print}'
111
$ echo '666
> 222' |awk 'FNR==1 && /111/ {print}'
tides ()

Если exit-status интересен (для && etc), можно так: sed -n '1{/.../q};q1' (или на awk, внутрь ему можно передать выражение через -v)

anonymous ()

список документов

а, пардон, тогда awk, внутрення переменная FILENAME.

anonymous ()
Ответ на: комментарий от AITap

Делайте то же самое, но с $(head -n1 <file>).

AITap (22.04.2013 0:05:39)

т.е. сначала grep, а потом это?

skokov ()
WORKDIR="${PWD}" # anywhere you want
KEYWORD="linux" 

for file in "${WORKDIR}"/* ; do
    if [ -r "$file" -a -f "$file" ]; then
        head -n 1 "$file" | grep -qi  "$KEYWORD" && echo "$file"
    fi
done
KennyMinigun ★★★★★ ()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от tides

А зачем FNR, если == 1?

awk -v pat=.. '$0 ~ pat {print FILENAME} {nextfile}' **/*(.)
anonymous ()

Не совсем bash, но:

perl -e ' foreach (@ARGV) { push @files, glob ("$_") }; foreach(@files) { open $f, "<", "$_"; $fl = <$f>; print "$_  $fl" if $fl =~ /pattern/  }' "a*" b.txt

nanosleep2 ()
Ответ на: комментарий от nanosleep2

раз такая пьянка:

ruby -e 'ARGV.each{|f| puts f if File.open(f).readline =~ /.../}'
anonymous ()

$ find -type f -name «*.c» -exec sed -n '1{/io/p;q}' {} \;

find ищет все регулярные файлы с именем *.c

и отдаёт их имена команде sed, которая ищет в первой строке io, если есть - печатает

на этом работа sed завершается.

drBatty ★★ ()
Ответ на: комментарий от drBatty

1) нужен _список файлов_, а не строк; 2) {} \; - потенциально долго (по сравнению с awk); 3) sed уже был)

anonymous ()

На чистом bash можно как-то так
Первый аргумент — директория, второй — слово

#!/bin/bash

for f in "$1"/*; do
    if [[ -f $f ]]; then
        if read line; then
            re=\\b$2\\b
            if [[ $line =~ $re ]]; then
                echo "$f"
            fi
        fi < "$f"
    fi
done
BlackHawk ()
Ответ на: комментарий от anonymous

1) нужен _список файлов_, а не строк;

значит с помощью sed нужно возвращать код возврата (команда q77 выдаёт код 77), в случае фэйла, а если всё ok, пусть find печатает имя файла следующей за -exec опцией -print(f).

2) {} \; - потенциально долго (по сравнению с awk);

откуда такие данные? По моим замерам примерно одинаково.

3) sed уже был)

ну как же: sed был, а drBatty не было? ☺

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.