Hacker News new | ask | show | jobs
by cleech 3436 days ago
fun, although I did cheat a bit on the corrupted text and pulled the expected output from README instead of the input file :)
1 comments

The answers I came up with are in https://github.com/jarv/cmdchallenge/blob/master/challenges.... if you are curious.
The awk line for duplicate lines without changing ordering is… wow. Awk is such an underused tool (at least for me.) My solution was:

    awk '{printf "%2d %s\n", NR, $0}' < faces.txt | sort -k 2 -u | sort -n | sed 's/^...//'
Ironically, it also involved awk! But I used it to prepend line numbers, which uniq and sort can ignore, then re-sort it according to line numbers. Very much not an ideal solution!
Mine was more procedural - store each line in a hash as you visit it, and only print lines you haven't already visited. awk is awesome ;-)

awk '!h[$0] {h[$0]=1; print}' faces.txt

I also used this approach but the original creator's version posted on GitHub is remarkably more concise (due to a clever use of the ++ operator).
awk '!h[$0]++' faces.txt

That is clever! Awk golf hole-in-one ;-)

I love awk. I used to be afraid of it, but I started using it just to pluck columns, and over a couple years actually started to grok it.

Also, I learned today that cat takes a -n option to prepend line numbers to the output! My solution ended up being

    cat -n faces.txt | sort -k2 -k1n | uniq -f1 | sort -nk1,1 | cut -f2-
That was a tough one. In the end something like this:

< war_and_peace.txt tr -s '!' | sed 's/!\([a-z]\)/\1/g' | sed 's/!\( [a-z]\)/\1/g' | sed 's/!\.!/./g' | sed 's/ !/ /g'

However, I don't think I learnt much from that. :-)

Mine was a bit more procedural, if that's what you were looking for:

  awk '{l++;gsub("!","");t[1]=4;t[4]=2;t[9]=3;o=$1;for(i=2;i<=NF;i++){o=o " " $i (i==t[l]?"!":"")};print o}' war_and_peace.txt
The description for remove_duplicate_lines needs some clarification, because as written it sounds like either "uniq" or "uniq -u". You should explicitly say that you want the first instance of every duplicated line printed, and all other duplicates not printed, even if not adjacent.
Thanks, also feel free to send a pull requests as I would definitely appreciate contributions.
Ah, I thought you knew seq had a delimiter option! It does actually. :-)

    seq -s ' ' 1 100
Just "echo {1..100}" works too.