Unix Legend Adding Unicode Support To AWK - Once He Figures Out Git (arstechnica.com) 103
Co-creator of core Unix utility, now 80, just needs to run a few more tests. From a report: A Princeton professor, finding a little time for himself in the summer academic lull, emailed an old friend a couple months ago. Brian Kernighan said hello, asked how their US visit was going, and dropped off hundreds of lines of code that could add Unicode support for AWK, the text-parsing tool he helped create for Unix at Bell Labs in 1977. "I have tested this a fair amount but clearly more tests are needed," Kernighan wrote in the email, posted as a kind of pseduo-commit on the onetrueawk repo by longtime maintainer Arnold Robbins. "Once I figure out how ... I will try to submit a pull request. I wish I understood git better, but in spite of your help, I still don't have a proper understanding, so this may take a while." Kernighan is the "K" in AWK, a special-purpose language for extracting and manipulating language that was key to Unix's pipeline features and interoperability between systems. A working awk function (AWK is the language, awk the command to invoke it) is critical to both Standard UNIX Specification and IEEE POSIX certification for interoperability. There are countless variants of awk, but "One True AWK," sometimes known as nawk, is the version based on Kernighan's 1985 book The AWK Programming Language and his subsequent input.
Kernighan is also the "K" in "K&R C," the foundational 1978 book The C Programming Language he cowrote with Dennis Ritchie that sticks with programmers, mentally and in dog-eared paper form. C's roots go much deeper. Kernighan had been teaching C to workers at Bell Labs and convinced its creator, Dennis Ritchie, to collaborate on a book to spread the knowledge. That book gave birth to "the one true brace style," the endless debate that goes with it, and the structure underpinning every modern programming language. Kernighan also named Unix and first demonstrated the "Hello, world" code example.
Kernighan is also the "K" in "K&R C," the foundational 1978 book The C Programming Language he cowrote with Dennis Ritchie that sticks with programmers, mentally and in dog-eared paper form. C's roots go much deeper. Kernighan had been teaching C to workers at Bell Labs and convinced its creator, Dennis Ritchie, to collaborate on a book to spread the knowledge. That book gave birth to "the one true brace style," the endless debate that goes with it, and the structure underpinning every modern programming language. Kernighan also named Unix and first demonstrated the "Hello, world" code example.
Maybe once he figures on /. (Score:5, Funny)
Well they kinda had it... (Score:2)
we'll finally have unicode support here.
Well, it seems like they did have it with the site re-design, that was so unpopular they pulled the whole thing and we never saw anything new again.
I didn't think is was that bad personally, I just wish they had ket closer to the current UI design and simply added Unicode support to that.
Maybe Slashdot unicode support still exists somewhere in a branch someone could dig up?
Slashdot however strikes me as the ultimate example of "if it ain't broke don't fix it", so I w
Re: (Score:3)
It's precious that you think any of the current owners of /. actually know a single line of code for this site, or have made any meaningful changes other than shoving more ads down our throats in the last 5 years.
Re: (Score:2)
I think Nazi guy might be back once he figures out git.
Quotes... (Score:1)
And really now, what're you gonna use it for? Languages other than English? Smileys? "Smart" quotes?
I kind of agree with this, I don't really see a pressing need to support emojis for discussion.
However the one area where it would be kind of nice, is if you were copying a quote from something special characters would actually come out OK.
So maybe instead of full Unicode support, some sort of limited translation of unicode quoting and punctuation characters into ASCII would be enough...
Re: Well they kinda had it... (Score:1)
Les me guess. Youâ(TM)re American, right?
Re: Well they kinda had it... (Score:2)
Testing this âoeUnicodeâ thing. How beautifully it translates the double quotes, and Iâ(TM)m especially impressed by the single quotes. These are probably the most useless characters anyway.
Re: Well they kinda had it... (Score:2)
That is the modern mobile experience. I am sorry to say I do not write this on a mainframe console.
Re: (Score:2, Offtopic)
A seriously bad idea! (Score:2)
The efficiencies of Grep come from the reliable single byte character stride of the text. With Unicode there's too many alternate frame shifts with variable byte character representation . Not to mention all the escapes and modes.
Grep on Unicode is pathetically slow
Re: (Score:2)
Code points vs. grapheme clusters (Score:3)
In a way, UTF-32 is also variable width because a written character (called an "extended grapheme cluster" in the Unicode Standard) often consists of multiple code points, even if UTF-32 represents each code point with a fixed-size code unit. Or at least that's the impression I get from the UTF-8 Everywhere manifesto [utf8everywhere.org].
Re: (Score:2)
Grep on unicode or not is always the same speed, as bottom line it uses BYTES does not matter it 2, 4, 8 bytes are a unicode char or a single ascii char.
Re: Well they kinda had it... (Score:1)
Theyâ(TM)ve saved lots of ££££s (thatâ(TM)s GBP sterling) by not fixing it
Re: (Score:1)
This is from a desktop web browser: ££££
Disabling smart punctuation on an iPhone won't fix this issue you ignorant twat. The correct solution is a fix by /.. They're the only web site on the entire internet with this problem.
Re: (Score:1)
In Safari on my Mac, I can get the currency symbol to work: £
I did this by changing the text encoding of the page from "Default" (presumably UTF-8) to "Western (ISO Latin 1)". This isn't an option for Firefox users because Mozilla took away the ability to change the text encoding! [mozilla.org]
Re: (Score:2)
we'll finally have unicode support here.
Unicode support has been in Perl for a long while. I suspect the limitation in /. is that the current owners don't care to spend the money on the necessary dev work. Slashdot at one point open sourced its engine as Slashcode, but I don't see any evidence the public project has been kept up to date or is leveraged much, if at all, any more?
Re: (Score:2)
Well, the blue site has implemented unicode in Slashcode, maybe simply ask them to do the work for some money then. I still wonder about exploits related to unicode although, many must have been fixed but I suspect there might still be some lurking around. Anybody knows more than I do about the status on this?
Re: Maybe once he figures on /. (Score:2)
I don't know about any blue site, but the people at the red site got Unicode into Slashcode.
Re: (Score:2)
LOL! The site is blue once you login.
Re: (Score:2)
Well, the blue site has implemented unicode in Slashcode, maybe simply ask them to do the work for some money then. I still wonder about exploits related to unicode although, many must have been fixed but I suspect there might still be some lurking around. Anybody knows more than I do about the status on this?
I think I am out of the loop here. What is this blue site you are talking about?
Re: (Score:2)
Nope. Never. (Score:2)
Too many people here like the fact that being so backwards as to not use proper literary quotes causes issues with the default iOS text behaviours. You can't take people's "smug" away or they'll resent it.
Re:Maybe once he figures on /. (Score:5, Informative)
Internally slashcode supports Unicode, and has for decades.
The problem is Unicode is problematic to support - you cannot just blindly treat all text someone types as innocent - there are plenty of codepoints that will cause you problems if you do not handle them.
So the site has a Unicode whitelist of supported characters - basically the printable ASCII set, and as a protection against hacks, it also strips off the high bit.
You can tell when a site owner naively implements Unicode support because their site is promptly made unreadable as everyone puts up a comment containing overdecorated characters, RTL control codes and other codepoints in that basically turn the site into a complete mess.
Handling Unicode is hard. It's caused more than its fair share of problems through the years, including several notable Android and iOS crashes
Anyhow, Brian Kernigan announced Unicode support on AWK during a Computerphile episode as well
https://www.youtube.com/watch?... [youtube.com]
Re: (Score:2)
This is one of the two major flaws in Unicode, the other being botched Chinese/Japanese/Korean support.
Unicode should have been designed to make text processing easy, and defined any metadata needed to avoid the kinds of problems that Unicode support brings. Instead it's left to ever developer and most can't handle it, so you get a broken and/or limited implementation.
Re: (Score:2)
So knowing very little about unicode but putting my PHB hat on - does this mean that all that needs to happen is some junior developer identifies the top 80% of unicode characters used in comments in the past year (looking at comments rated 4 or 5 to avoid the spam), do a quick manual review and then add them to the whitelist?
That sounds like a j
...so, never? (Score:5, Interesting)
Re:...so, never? (Score:5, Insightful)
The more I use git, the less I feel I have a decent grasp of it.
Re: (Score:1)
The more I use git, the less I feel I have a decent grasp of it.
The more you know, the more you know you don't know.
Re:...so, never? (Score:5, Insightful)
Re:its time for git to go (Score:4, Insightful)
maybe a new vcs that is under the covers identical to git
That exists, it is called Mercury. I can't seem to get anyplace to use it. But then again I can't seem to get anyone to explain to me why a commercial company with a few hundred of developers would use git in the first place. I'm sure someone who is too young to have used anything other than Git will tell me about all its great features. My response, "So what, every other SCM does that too". Git has without a doubt the worst UX in widespread use ever developed by humans. When someone questions if devs can write UIs, I point at Git. Git's UX seems to be designed to be confusing. Clone means Checkout, Checkout means Update, Pull means checkout plus update metadata too, Commit doesn't do anything really useful (just part of the ritual you have to do), Push means Commit. Pull requests with a WebUI is the only useful new feature Git added. Add that feature to CVS or SVM and you have something much better than Git for most commercial development. Git was made for the Linux kernel project and it is unnecessary for the vast majority of software projects.
Re: (Score:1)
Commit doesn't do anything really useful (just part of the ritual you have to do), Push means Commit.
This reveals that you don't understand the single basic feature that makes git different from systems like Subversion - the ability to create multiple commits (which are smaller and easier to understand than one large commit) locally and then make them available to others all at once.
Re:its time for git to go (Score:5, Insightful)
The equivalent of local git commits are called checkpoints in subversion and it was added in 2018.
https://subversion.apache.org/... [apache.org]
I've heard a lot of folks pointing to things that git does that subversion cannot do. In many cases they compare git to a release of subversion from before git was released.
Git has a lot of problems, it makes some easy things really hard, but it has won the mindshare war years ago thanks to GitHub.
Most modern development tools can talk to git, and often time to GitHub, but svn, cvs, mercurial, Perforce -to name a few- are not going to have the same level of integration. So at the end of the day I use git based on the mindshare, not on the technical merit.
Re: its time for git to go (Score:1)
Re: (Score:2)
Commit doesn't do anything really useful (just part of the ritual you have to do), Push means Commit.
This reveals that you don't understand the single basic feature that makes git different from systems like Subversion - the ability to create multiple commits (which are smaller and easier to understand than one large commit) locally and then make them available to others all at once.
Then why is the hot feature something called a squash commit that merges multiple commits into 1? Seriously, it is a car with seven steering wheels and everytime you defend it, you just make people blame you for having to use git. I can learn any other SCM in minutes. After years, almost everyone I know is still confused about git. Developers don't write code to test your SCM install. Everytime we have to solve a git problem (which doesn't happen with other SCMs) that is a waste of our time. Git is th
Re: (Score:3)
Re: (Score:2)
Re: (Score:1)
Git is not SVN, neither (thanks god) CVS. It is different, faster, better, and *distributed*. Yes, you can use it as a better SVN, but git is much, much more.
Re: (Score:2)
Everyone knows git has a different model than SVN. But the vast majority of developers don't use git any differently than they use SVN.
For most developers, the #1 thing git offers is easy access to repositories hosted on a server someone else maintains. Github and similar services are the draw, not git itself. People tolerate git to get Github.
Re: (Score:2)
You don't need git to use Github, just download the source in a zip.
Re: (Score:2)
Re: (Score:2)
But then again I can't seem to get anyone to explain to me why a commercial company with a few hundred of developers would use git in the first place.
I think the dominance of GitHub plays a role.
Students are taught how to use git and GitHub and GitHub offers a generous "Student Developer Pack" to further entice them. Recruiters expect to see a candidate's GitHub page; I've never seen an application form ask for one's Bitbucket or GitLab. For better or worse, there's a Facebook effect of "I use it because everyone else uses it."
Re: (Score:2)
Bitbucket and GitLab are basically offering the same service as Git. They don't really matter here.
The big issue is those services exist, but there was never anything like it for SVN or whatever. You have to host SVN yourself and maintain it.
Using GitHub (or similar) and tolerating git usually ends up being the path of least resistance.
Re:its time for git to go (Score:5, Insightful)
You have some serious misconceptions about how git works. You don't understand how git work because you are stuck in old paradigms.
> Clone means Checkout,
Clone means copy a remote repository and make a local one. It is how you "fork" a repository.
> Pull means checkout plus update metadata too
pull is an alias that does TWO things:
1. git fetch (which fetches changes from the remote repository but does NOT merge them into your local working branch.)
2. git merge (which merges those remote changes into your tree.)
> Commit doesn't do anything really useful (just part of the ritual you have to do),
You modify local files. You flag these changes to be "held" in a staging area via git add.
When you have all your changes ready you "commit" your change(s) by telling the local git repository to add a new delta entry of changes.
> Push means Commit
No it doesn't. It syncs up the remote repository from your local repository by sending all the changes (commits) you have made to your local repository.
Git is a distributed version control. You can work offline and sync everything up when you are online. CVS is centralized version control system. CVS is complete shit and doesn't even other 10% of the functionality of git. Namely speed, authenticity, reliability, distributed, trivial branching, renaming, atomic transactions, changesets, binary file support.
Git was battletested via the Linux kernel. Any project can use git -- but if you have a lot of binary files I would recommend git LFS instead.
Re: (Score:2)
Re: (Score:2)
/Oblg. xkcd 378: Real programmers [xkcd.com]
> Repositories are central, by definition, as they were intended to be
Minor quibble on an otherwise excellent bit of satire. Another name for repository is a library. Libraries can indeed be local as can repositories.
This is what make git so powerful: I can initialize a local repository via:
and make local commits to it via git add and git commit. If sometime down the road I want to add a remote repository all I have to do is:
I see your problem (and solution). It's not 1982 (Score:2)
Git was the last version control system I learned, after having used SVN and CVS. I see exactly what's tripping you up.
The UI for a dishwasher would be really confusing and awkward, if you thought it was the UI for a DVR.
That's what's happening here - you're trying to figure out the Git interface based on the idea that you're working as terminal, using some far-away repository on the mainframe as if it's 1982. That's not what's happening. The repo is not on some mainframe somewhere. That's how CVS works;
Re:...so, never? (Score:5, Informative)
git is easy once you understand the 5 different locations code can be.
This nice cheat sheet [ndpsoftware.com] shows the commands available for each location.
* stash
* workspace
* index
* local repository
* remote repository
Re:...so, never? (Score:4, Informative)
Complaining about a tool you don't understand only make you look like a fool.
The first two locations ...
* remote repository
* local repository
When you make local changes to your file(s) you are modifying your local "workspace". In order to update your local repository you need to "add" files that you have modified / deleted / renamed to a "staging" area. ". In git parlance this is called the index. You do this via: git add -p file
Then when you have all the files ready you actually "commit" the changes to the repository via: git commit -m "message"
Finally, you sync up the remote database with all your changes (commits) and "push" your changes via
--
Re: (Score:2)
Re: (Score:2)
If Kernighan doesn't get it, is he a fool? Or is git just fundamentally unintuitive?
I understand It is more a rhetorical question not meant to be answered, but I like to answer it anyway, because it is a concern for many of us (me included) aging Slashdot users from IT.
Kernigham is 80 something. And I really wishes everyone to keep being interested in code and willing to invest time coding at that age.
The biological clock and consequences of aging renders the brain less plastic. Learning new ways, new paradigms, new tools is harder because it requires activating new neuronal paths. It is n
Re: (Score:2)
If you know a different version control system, you automatically compare the old one with the new one.
And then it gets unintuitive.
Especially for git: you have to pretend not to know what rcs, cvs, svn/subversion etc is. And best simply start from a fresh plate.
Re: (Score:2)
Kernighan is definitely a smart cookie, however there are two issues:
1. Kernighan is 80. As you age your brain slowly accumulates calcium. This lowers your rate of learning. "Fossilized thinking" isn't just a meme.
2. There definitely is a big learning curve with git; it can take time to unlearn bad habits. Git is like a Swiss army knife: every features exists to solve a particular problem but if you aren't careful you can cut yourself. Thankfully it is relatively easy to "undo" most mistakes but yeah t
Re: (Score:1)
You don't need a remote repository either. You can do everything locally. But if you do want to share things then there's no option here.
Workspace and local repository - not really a lot of choice on these. You need a local area where you're working.
So that just leaves the index. And honestly I have no idea why this is necessary. I can see how it might be useful to have an optional extra stage t
Re: (Score:2)
You are forgetting the most important location, another folder without git (or with git). .git -folder and init a new blank git repo there). And periodically I take snapshots of said folder. Once I'm done with a feature, I will pull on the git folder, diffmerge all my changes there, add, commit, push. This way I never have to fight with any git problems like merges, conflicts etc. And also no
What I usually do is clone a repo and the rsync it to another folder where I will work on the code (often I do remove
Re: (Score:3)
Git is a distributed merge system with history. It is absolutely perfect for Linus' workflow and an absolute piece of shit for everyone else.
Once you understand it wasn't designed for what everyone is trying to use it for, the sooner the healing can begin.
Re:...so, never? (Score:4, Informative)
There are 3 parts of git really. The simple part that you use for daily stuff, which map relatively straight forward to other source code control tools. Then the part that is intended to be very low level commands that no human is expected to use directly, but which can be used for higher level tools. Then there's the last third that are in the middle: more advanced concepts, for experts maybe, or that involve more git-only concepts, and that third often trips people up.
Ie, "rebase", some people use it every day, but it really is an advanced concept that is difficult to really to grok; it's like "merge" and some people even use it as a synonym for "merge", it's really like replacing the bullets you normally use to shoot yourself in the foot with explosive rounds.
I gave the tutorial on git to the team, using it every work day for 3 years, and I *still* feel like a noob at it. Though I certainly like it better than the stuff I used preivously.
Re: (Score:2)
Ie, "rebase", some people use it every day, but it really is an advanced concept that is difficult to really to grok; it's like "merge" and some people even use it as a synonym for "merge", it's really like replacing the bullets you normally use to shoot yourself in the foot with explosive rounds.
I've found that several things with git are much easier to understand if you keep in mind that commits are objects and a repository is a tree of commits. With that mental model, rebase is basically just taking a bunch of commits, detaching them from where they currently are on the tree, and reattaching them somewhere else on the tree. This is a significantly different from a merge, which combines a branch back into the part of the tree that the branch started from. If you draw pictures of the trees, you can
Re: (Score:2)
Re: (Score:3)
Mostly you just try to get through it, like hacking through a jungle with a machete.
Before I do anything with git, I back up my local source tree.
That says enough about it.
This AWK guru wants ranged regex quantifiers first (Score:5, Informative)
AWK doesn't implement curly-bracket quantifiers in its regular expressions, like .{4} or .{2,5}. This isn't a part of all posix Extended Regular Expression specifications, so it's not deemed "missing", but it is specified in the latest POSIX ERE spec [opengroup.org], but I'd prioritize parity with GNU grep's ERE implementation above other features. UTF-8 support and a proper CSV implementation (to support values with quoted commas) sound nice too.
(Warning, I use mawk [invisible-island.net], not The One True AWK [github.com], aka "nawk", which is what Kerninghan is discussing.)
The real question, however, is how quickly any changes to The One True AWK trickle into the Posix spec and the more popular implementations (GNU awk, aka "gawk", BSD, mawk, and Busybox).
This is the kind of article which makes me smile. (Score:5, Interesting)
This is the kind of article which makes me smile. Real News for Nerds.
Doubly so because it's about a true luminary of our hobby / business / life. I may have "transitioned" to mainly a vm / windows environment.. but this.. this is Stuff That Matters.
Triply so because this gent is showing all of us that yes, old dogs do learn new tricks.. just a bit more slowly than a young pup.
Eds... take note... more of this, less of politicking and divisiveness. The only divisions we give a fuck here about are *nix vs. Everything Else, and vi vs. emacs.
Puh-leese. Pretty please. It doesn't escape all our notice that since the arab takeover, this place went to the dogs.
We have what now.. 2 dozen active posters? vs. hundreds not too long ago.
I wonder why!
If I had the dosh, I'd buy slashdot. But I don't, so now I just stfu except when I read patently retarded bullshit.
Re: (Score:3)
The only divisions we give a fuck here about are *nix vs. Everything Else, and vi vs. emacs.
That's not true! We care about Eucliean division too! :)
Re:This is the kind of article which makes me smil (Score:5, Funny)
The only divisions we give a fuck here about are *nix vs. Everything Else, and vi vs. emacs.
Why we insist on comparing a text editor to an OS I'm sure I don't know. But everybody knows emacs is the best OS. Now it just needs a good text editor...
Re: (Score:2)
I find that PowerShell is a really good way to edit text files. I would suggest you install it and .net on all your *nix boxes to try out.
There, did I properly engage your heart?
Re: (Score:2)
That kind of talk will get you banned!
Re: (Score:2)
Re: (Score:2)
Re: (Score:2)
old dogs do learn new tricks.. just a bit more slowly than a young pup
Maybe, maybe not. But the greybeard is far more likely to admit that learning this or that is hard.
Re: (Score:3)
Plenty of grey here. Still learnin'. Yeah it's slower, but.. it's still doable. Hardest part for me is to turn off the scatterbrain, which means caffeine and conscious effort.
Violin is bloody ruthless, for one. I started almost exactly one year ago. I watch how fast the kids learn the same instrument, and I go x.x
But I don't let it stop me.
That's why this article caught my eye. The guy's 80.
You want a real freak? Martha Argerich. She's 80, and she's better now than she's ever been. The older she g
Re: (Score:2)
Re: (Score:2)
> The only divisions we give a fuck here about are *nix vs. Everything Else, and vi vs. emacs.
I think we are also partisan to the systemd versus everything else debate.
Re: This is the kind of article which makes me smi (Score:1)
...and let's not forget, tabs vs. spaces!
Re: (Score:2)
I fully agree that the quality of articles has declined a lot.
But, what "arab takeover"?
Brace style (Score:1)
OTBS?
No thanks, I prefer Whitesmiths.
But fortunately, because of astyle, everyone can edit any shared code using their preferred brace style, regardless of what it is.
I honestly don't see why everyone doesn't use Whitesmiths, though. :)
Re: (Score:1)
Heh, I see there's now an extensive wikipedia article on the different styles. I don't see why everybody doesn't use allman. And I like to include a comment after the last brace that alludes to the complementary opening brace, i.e.:
while (a == b) .... /* end while a == b */
{
}
But that's me.
Re: (Score:3)
Heh, I see there's now an extensive wikipedia article on the different styles. I don't see why everybody doesn't use allman.
I second your endorsement of Allman style [wikipedia.org].
If Slashdot hasn't done a poll on this topic, it would be a a fun one to do.
Re: (Score:2)
Re: (Score:2)
There's a lot of terrible styles out there, and the Linux kernel one is just about the worst.
I had a look at it, and I'll say one thing. I really don't like the look of a closing brace followed by an opening brace on the same line, like "} else {".
Re: (Score:1)
Having a brace style that goes "} else {" really limits the ability to include a comment also. I gave an example in my previous post,
but with else statements I would have comments something like:
if (temp >= setpoint()) /* temp below set point */ /* end else temp at or above setpoint */
{
temp = lowertemp();
} else
{
checkotherstuff();
}
Re:Brace style fixing my bad example (Score:1)
aargh, I'll jump on this before anybody else does,
That last comment should be /* end else temp below setpoint */
}
BTW, being an old command line type, I could appreciate awk. I never really needed to do that much stuff of the kind that awk is good for, so I never quite got it in muscle memory. I was more of a sed guy because of the similarities to vi.
Why use awk (or sed)? (Score:2)
If I have to slice and dice output I will use Perl which is the Platonic Ideal of all those clumsy arcane tools.
Re: (Score:3)
While you can do almost anything with Perl, the elegance of piping awk and sed won me over. I had something that generated about 1 million data points per day, and essentially needed a quick way to consolidate that down to a single metric. It was easy and painless to learn enough to do it with AWK/SED, and wicked fast. Perl had been my go-to, but it was much more clumsy for this task.
Re: (Score:2)
Re: (Score:2)
Awk is excellent for columnar data from arbitrary tools:
dir | awk '{print $3}' # extract the third column of values
0
4
68
4
4
4
4
40
4
4
4
796
4
4
4
16
12
I know it can do more, that's enough to keep it in my toolbox.
Less lonely (Score:2)
git is like Perl (Score:2)
Most languages I can essentially not touch or think about for years and come back and generally pick right back up where I left off. Not so with Perl. Any time I ever have to write any code in Perl, I have to find a tutorial and completely relearn the language from the ground up just to understand any code I had previously written let alone begin writing new code in Perl.
Same thing's true with git. If it is anything outside of basic git add .; git commit -m "Message"; git push origin master/main, then I'
Ancient GAWK book cover art (Score:2)
Re: (Score:1)
Here's the book with the cover art:
https://isbn.nu/1882114256 [isbn.nu]
https://www.thriftbooks.com/w/... [thriftbooks.com]
Awk is quite a good utility. (Score:1)
Thank god I'm not the only one (Score:2)
Thanks, Brian, for being relevant still.