in reply to perl one liner for csv file one field

Here is an example input file test.txt:

D,642,0642,UBF,EVL,,M,,S,S,FOREVER,213,213, D,642,0642,UBF,EVL,,M,,S,S,QSP-U=C,4,4, D,642,0642,UBF,EVL,,M,,S,S,123456,4,4, D,642,0642,UBF,EVL,,M,,S,S,12345,4,4,
where the fields are separated by a comma. For example, FOREVER above is the eleventh field. This is just a guess based on your description. Please correct me if this is wrong.

Given the above assumption, the following one-liner:

perl -nlaF/,/ -e 'length($F[10]) < 7 and print' test.txt
prints to stdout:
D,642,0642,UBF,EVL,,M,,S,S,123456,4,4, D,642,0642,UBF,EVL,,M,,S,S,12345,4,4,
i.e. prints out only those lines where the eleventh field is less than seven characters in length.

See perlrun for details of the -a and -F command line switches to perl.

Once you are happy that works and meets the spec. you could add the -i switch to auto-edit the file.

Replies are listed 'Best First'.
Re^2: perl one liner for csv file one field
by morgon (Priest) on Jan 18, 2015 at 04:58 UTC
    the following one-liner:

    perl -nlaF/,/ -e 'length($F[10]) < 7 and print' test.csv

    Is parsing csv with a split not a crime in the same category as parsing html with regexes?

    After all the fields might contain escaped delimiters...

    Here another attempt using Text::CSV_XS that processes the file line-by-line (Tux's solution slurps with my not be good for very large files):

    perl -MText::CSV_XS=csv -ne 'print if length(csv(in => \$_)->[0]->[10]) > 6'

      The new filter option filters on read, so large files are no problem. I like your approach, but it will FAIL on lines with embedded newlines, as the next csv iteration will not continue from the previous.


      Enjoy, Have FUN! H.Merijn