2016-04-26 3 views

ответ

7

Когда вы проходите через линии с использованием awk, разделитель полей используется перед обработкой записи. awk считывает запись в соответствии с текущими значениями FS и RS и выполняет операции, которые вы просите.

Это означает, что если вы укажете значение FS при чтении записи, это не повлияет на эту конкретную запись. Вместо этого, для следующего и за его пределами.

Так что если у вас есть файл, как это:

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

И установить разделитель полей при чтении одной записи, он вступает в силу со следующей строки:

$ awk '{FS=","} {print $1}' a 
1,2 
5 

Так что вы хотите сделать это, чтобы установить FS перед чтением файла. То есть, в блоке BEGIN, или с помощью параметра:

$ awk 'BEGIN{FS=","} {print $1}' a 
1 
5 
$ awk -F, '{print $1}' a 
1 
5 

Существует и другой способ: может awk пересчитывать полную запись. При этом, awk будет принимать во внимание текущие FS и действовать соответственно:

$ awk '{FS=","} {$0=$0;print $1}' a 
1 
5 
+0

Предположим, что моя первая строка 'Cal_Tno_V19_F04_R02'. Как использовать 'awk' для печати' Cal_Tno', т. Е. Для печати первых двух полей с разделителем? – Sigur

+0

@Sigur это, кажется, совершенно другой вопрос к тому, что я отвечал здесь. Лучше, если вы [задаете новый вопрос] (/ questions/ask), предоставляя достаточно подробностей! – fedorqui

3

AWK Заявление используется неправильно

Правильный путь

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

В вашем случае вы можете использовать

awk 'BEGIN { FS = "_length" } ; { print $1 }' 
0

ВСТРОЕННЫЙ переменные, такие как FS, ПРС и т.д., должны быть установлены в контексте т.е. в 1 из следующих блоков: BEGIN, блоки условий или END.

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

Вы также можете передать разделитель используя -F переключатель, как это:

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk -F "_length" '{print $1}' 
NODE_1 
$ 
Смежные вопросы