Remove whitespace before a field using AWK

2019-07-13 21:14发布

问题:

(Almost exact duplicate of Keeping original format POST passing through AWK submitted by same person.)

I have a simple question pertaining to gawk, illustrated below:

  1 int blah (void)
  2 {
  3         if (foo) {
  4                 printf ("blah\n");
  5         }       
  6         return 0;
  7 }  

Using the following gawk code - using gensub() to maintain original formatting:

 gawk '{ print gensub($1, "\t", 1) }' ./sample_code.out

     int blah (void)
     {
             if (foo) {
                     printf ("blah\n");
             }       
             return 0;
     }  

How can I use gawk or awk (maybe with regular expressions) to remove previous whitespace before field $1 (^ )

Illustrated below:

 int blah (void)
 {
         if (foo) {
                 printf ("blah\n");
         }       
         return 0;
 }  

Kind regards in advance

回答1:

This works, but in the knowledge that you'll always want to strip 3 spaces.

vinko@parrot:~$ cat foo.c
  1 int blah (void)
  2 {
  3         if (foo) {
  4                 printf ("blah\n");
  5         }
  6         return 0;
  7 }

vinko@parrot:~$ gawk '{ print gensub(/^   /,"",1,gensub($1, "", 1)) }' foo.c    
int blah (void)
{
        if (foo) {
                printf ("blah\n");
        }
        return 0;
}



回答2:

awk '{sub(/^[ \t]+/, ""); print}'

This is from the famous awk 1 liners list, can be found here: http://student.northpark.edu/pemente/awk/awk1line.txt



回答3:

This strikes me as being a case of 'wrong tool for the job'. I'd use sed`:

sed 's/^[ <tab>]*//' sample.out

Now, if the problem is all about the inner-most details of awk, this may be no help; if the problem is to get spaces removed, it is quicker and (at least arguably) simpler.