Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete a field by position from a long line

Tags:

linux

bash

csv

awk

I have a long, semicolon separated line of fields, 69 of them, to be precise.

I need to delete field 3, so I could, in a verbose manner, do:

awk -F\; '$1 == 3 { print $1";"$2";"$4 ... }' a.txt

Which would get really long. Is there a shortcut to say '$4 to the end', '$4 to $69' or maybe just 'delete $3'?

Related to the question: Repeating ";" all over the place is very unconvenient.

Of course, I could generate the command in part with:

echo -e "\b"{4..69}"\";\"$"

but while it looks clever, the result is a multiline command, which is not elegant to handle.

What is an elegant solution - preferably in pure awk.

I guess I can find a sed-solution fast, but I have more things to do (recalculate Field 5: if Field 1 == 2, Field5 = 5-Field5), which would be hard in sed, but I guess a good fit for awk.

I'm using Gnu-AWK 3.1.6, if it matters, but have, according to apropos:

  • awk
  • gawk
  • igawk
  • mawk
  • nawk
  • pgawk

ok, update:

I should have known better, and provided some test data right away, but of course, I will try out all your answers and upvote what looks promising.

3;03.2012;7228;0;1;3;1;3;4;3;1;3;4;3;2;0;4;4;1;1;4;2;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;1;1;3;0;3;1;3;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
3;03.2012;7229;0;2;2;0;5;5;4;4;5;5;4;4;2;5;5;0;0;3;3;0;0;5;6;0;0;0;0;0;2;2;1;2;1;2;2;2;4;3;4;1;5;4;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;4;0;0;0;0;0;0;0;
3;03.2012;7230;0;2;2;2;4;3;4;4;4;3;3;3;2;4;6;1;1;1;6;5;1;6;6;1;1;1;1;1;2;2;1;2;2;0;2;2;3;4;2;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;3;3;4;4;0;0;0;0;0;0;0;
3;03.2012;7231;0;1;3;1;4;4;3;3;4;4;4;4;2;5;5;1;1;4;6;5;1;4;1;1;1;1;1;5;2;1;1;2;0;0;1;2;4;4;3;1;4;3;2;0;0;0;0;0;0;0;0;0;0;4;4;4;4;3;0;0;0;0;0;0;0;

just hold the line. :)

like image 435
user unknown Avatar asked Mar 27 '12 15:03

user unknown


1 Answers

I'm not sorry to interrupt this perverse game of golf. Do you masochists take pleasure in reinventing the wheel? Civilisation offers modern man such amenities as sewage collection and CSV libraries so he doesn't have to deal with—

How about as csvfix? It's a command-line tool that works with text streamed in and out, ie. the same environment as awk. The command you need is exclude

csvfix exclude -f 3 -rsep ";" a.txt
like image 116
Colonel Panic Avatar answered Sep 29 '22 20:09

Colonel Panic