shantanuo
shantanuo

Reputation: 32316

Tab separated values in awk

How do I select the first column from the TAB separated string?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

The above will return the entire line and not just "LOAD_SETTLED" as expected.

Update:

I need to change the third column in the tab separated values. The following does not work.

echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt

This however works as expected if the separator is comma instead of tab.

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt

Upvotes: 117

Views: 351293

Answers (8)

RARE Kpop Manifesto
RARE Kpop Manifesto

Reputation: 2801

  • 1st column only

    awk NF=1 FS='\t'

 LOAD_SETTLED
  • First 3 columns

    awk NF=3 FS='\t' OFS='\t'

 LOAD_SETTLED    LOAD_INIT    2011-01-13
  • Except first 2 columns

    {g,n}awk NF=NF OFS= FS='^([^\t]+\t){2}'

    {m}awk NF=NF OFS= FS='^[^\t]+\t[^\t]+\t'

 2011-01-13    03:50:01
  • Last column only

    awk '($!NF=$NF)^_' FS='\t', or

    awk NF=NF OFS= FS='^.*\t'

 03:50:01

Upvotes: 1

arainchi
arainchi

Reputation: 1492

If your fields are separated by tabs - this works for me in Linux.

awk -F'\t' '{print $1}' < tab_delimited_file.txt

I use this to process data generated by mysql, which generates tab-separated output in batch mode.

From awk man page:

   -F fs
   --field-separator fs
          Use fs for the input field separator (the value of the FS prede‐
          fined variable).

Upvotes: 2

glenn jackman
glenn jackman

Reputation: 246807

You need to set the OFS variable (output field separator) to be a tab:

echo "$line" | 
awk -v var="$mycol_new" -F'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

(make sure you quote the $line variable in the echo statement)

Upvotes: 164

Bruno Bronosky
Bruno Bronosky

Reputation: 70339

Use:

awk -v FS='\t' -v OFS='\t' ...

Example from one of my scripts.

I use the FS and OFS variables to manipulate BIND zone files, which are tab delimited:

awk -v FS='\t' -v OFS='\t' \
    -v record_type=$record_type \
    -v hostname=$hostname \
    -v ip_address=$ip_address '
$1==hostname && $3==record_type {$4=ip_address}
{print}
' $zone_file > $temp

This is a clean and easy to read way to do this.

Upvotes: 26

John Kloian
John Kloian

Reputation: 1474

You can set the Field Separator:

... | awk 'BEGIN {FS="\t"}; {print $1}'

Excellent read:

https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html

Upvotes: 20

asadz
asadz

Reputation: 174

Should this not work?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'

Upvotes: -3

shantanuo
shantanuo

Reputation: 32316

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'

Upvotes: 6

Mahmoud Abdelkader
Mahmoud Abdelkader

Reputation: 24939

Make sure they're really tabs! In bash, you can insert a tab using C-v TAB

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED

Upvotes: 24

Related Questions