Hacker News new | past | comments | ask | show | jobs | submit login

And here is the ungolfed version:

awk '{ if (! visited[$0]) { print $0; visited[$0] = 1 } }'




Yes. Examples like the one linked make it appear that awk is write-only language, which it really isn't.

'awk' is really a very beautiful little language. It's concise enough to solve many tasks in a single line, making it easy to use interactively while still being able to grow to moderately-sized scripts. It's not supposed to replace a full-blown scripting language like Python, but for processing files line-by-line it's superb.


Or maybe better:

awk '! visited[$0] { print $0; visited[$0] = 1 }'


yet another version:

    awk '!($0 in seen); {seen[$0]}'


Much more readable and understandable.


You can always write AWK in a file and read the script with -f, making it fully readable (and AWK is quite a pleasantly readable and surprisingly versatile language to write at that point)


to add to this, if you've coded one-liner first, you can convert to script using -o option

for ex:

    awk -o '{ORS = NR%2 ? " " : RS} 1'
gives (default output file is awkprof.out)

    {
        ORS = (NR % 2 ? " " : RS)
    }

    1 {
        print $0
    }


I wasn't aware of this, might come handy for "one liner edge cases".


That I did not know, great tip, thank you!




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: