Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

awk field separator not working for first line

Tags:

awk

echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}'

Obtained output:

NODE_1_length_317516_cov_18.568_ID_4005

Expected output:

NODE_1

How is that possible? I'm missing something.

like image 466
biotech Avatar asked Apr 26 '16 05:04

biotech


2 Answers

When you are going through lines using Awk, the field separator is interpreted before processing the record. Awk reads the record according the current values of FS and RS and goes ahead performing the operations you ask it for.

This means that if you set the value of FS while reading a record, this won't have effect for that specific record. Instead, the FS will have effect when reading the next one and so on.

So if you have a file like this:

$ cat file
1,2 3,4
5,6 7,8

And you set the field separator while reading one record, it takes effect from the next line:

$ awk '{FS=","} {print $1}' file
1,2                             # FS is still the space!
5

So what you want to do is to set the FS before starting to read the file. That is, set it in the BEGIN block or via parameter:

$ awk 'BEGIN{FS=","} {print $1}' file
1,2                             # now, FS is the comma
5
$ awk -F, '{print $1}' file
1
5

There is also another way: make Awk recompute the full record with {$0=$0}. With this, Awk will take into account the current FS and act accordingly:

$ awk '{FS=","} {$0=$0;print $1}' file
1
5
like image 175
fedorqui 'SO stop harming' Avatar answered Nov 17 '22 02:11

fedorqui 'SO stop harming'


awk Statement used incorrectly

Correct way is

awk 'BEGIN { FS = "#{delimiter}" } ; { print $1 }'

In your case you can use

awk 'BEGIN { FS = "_length" } ; { print $1 }'
like image 2
Harshit Anand Avatar answered Nov 17 '22 02:11

Harshit Anand