2016-02-17 4 views
1

Добрый день всем.Awk не работает с первой строкой

Не могли бы вы, пожалуйста, помогите мне с некоторыми из моего файла проблемы подготовки:

У меня есть файл:

2:1 3:1 4:2 5:1 7:2 34:1 37:3 ... 
4:2 6:1 8:1 23:1 25:2 30:1 ... 

Я хотел бы получить:

20002:1 20003:1 20004:2 20005:1 20007:2 20034:1 20037:3 ... 
20004:2 20006:1 20008:1 20023:1 20025:2 20030:1 ... 

Я пытался :

awk '{FS=":"; RS=" "; OFS=":"; ORS=" "}{$1=$1+20000; print $0}' 

Но это работает только частично: он не работает с первой линией, давая 20002:1:3:1:4:2.., и не работает с первым элементом каждой строки, давая 4:2 20006:1 20008:1 ...

ответ

4

Вы можете использовать это (GNU AWK только для RT)

awk 'BEGIN{FS=OFS=":";RS="[[:space:]]"}{ORS=RT;$1=$1+20000; print $0}' file 

20002:1 20003:1 20004:2 20005:1 20007:2 20034:1 20037:3 
20004:2 20006:1 20008:1 20023:1 20025:2 20030:1 

Объяснение

BEGIN{ 
#Only run at start of script 
FS=OFS=":" 
#Set input and output field separator to : 
RS="[[:space:]]" 
#Set the record separator to any space character e.g `\n` `\t` or ` ` 
} 


{ORS=RT 
#Set the output record separator to whatever was captured by the input one, i.e keep newline space or tab in the right places 
$1+=20000; print 
#Do your math and print, note that `+=` is shorthand for adding to the current value, 
#and also that print can be used on it's own as by default it prints $0(you can also use 1 
#at the end of the script as this evaluates to true and the default action if no block 
#is defined is to print the current line) 
}' 
+0

@ EdMorton Я знаю, но поскольку OP уже предоставил этот код, и он работает (даже если это не самый простой способ), тогда я, хотя было бы лучше оставить его. – 123

+0

@ EdMorton Я думал, что выгода не слишком объясняла и объясняла только части, которые могли бы заставить его не работать, а не те части, которые выглядят не так красиво. Я буду редактировать, хотя. – 123

+1

@EdMorton Может быть, они все еще там. Может быть, я просто немного ленив. – 123

2

в случае не имея GNU AWK в соответствии с требованиями @ 123 более элегантное решение:

$ awk -F"[: ]+" '{for(i=1;i<NF;i+=2){$i+=20000; printf "%s:%s ",$i,$(i+1)} print ""}' cs.txt 

20002:1 20003:1 20004:2 20005:1 20007:2 20034:1 20037:3 
20004:2 20006:1 20008:1 20023:1 20025:2 20030:1 
Смежные вопросы