chhotii: (caffeine)
chhotii ([personal profile] chhotii) wrote2013-12-10 02:39 pm
Entry tags:

UNIX geek challenge

UNIX Geek Of The Day bragging rights to whoever can propose the best solution to this problem: Identify all text files in the current directory which contain the string "jpg" on two consecutive lines. Using the typical command-line tools such as grep, not by writing a program. Extra points if the location (line number) of these consecutive lines of interest are output.

Posted via LiveJournal app for Android.

ceo: (blueshirt)

[personal profile] ceo 2013-12-10 08:25 pm (UTC)(link)
With GNU grep, the -P option enables Perl regular expressions, which handle newlines better than plain ol'regexes do.

grep -Pn '.*jpg.*\n.*jpg.*' * appears to work.
ext_106590: (waffle off)

[identity profile] frobzwiththingz.livejournal.com 2013-12-11 01:21 am (UTC)(link)
Ok, Chip's got a good answer... Here's a truly horrible one:

for I in *; do test -f "$I" && awk ' BEGIN { last = 0 ; status = 1 } { if (/jpg/) { if (last == 1) { print $0, "line number ", NR ; status = 0 } else last = 1 } else last=0 } END { if (status == 1) exit 1 }' < "$I" && echo " file $I matches"; done

Don't use this. There's *got* to be a horrible bug in there somewhere. Unless you hate your workplace. In that case, make sure it gets into some important automated build process.

[identity profile] achinhibitor.livejournal.com 2013-12-11 02:11 pm (UTC)(link)
I can do this without using anything that is programmable (like sed or awk):

for FILE in *
do
    paste <(head --lines=-1 $FILE) \
         <(while read X; do echo Throat-warbler-mangrove ; done <$FILE) \
         <(tail --lines=+2 $FILE) |
    grep -n $'jpg.*\tThroat-warbler-mangrove\t.*jpg' &&
    echo $FILE
done
Edited 2013-12-11 14:12 (UTC)