2013-07-22 2 views
1

У меня есть файл, где я хочу заменить шаблон, который заканчивается концом строки \n ... Я искал в Интернете способ сделать это но ни один из них не работает ... Я могу заменить конец линии к другим вещам, но не образец, содержащий конец строки ..найти и заменить, когда шаблон содержит n - linux command line

Вот пример текстовый файл имеет следующее:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0 
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0 
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3 
19.0,-999,-999,-999,-999,-999,100,21,-999,-999, 

В последней строке отсутствует значение (оно может быть в любой другой строке), и я хочу найти \n и заменить на, -999

Таким образом, текст становится похожим на это:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0 
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0 
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3 
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999 

любые идеи ????

ответ

0

Может заменить ,\n с ,-999\n

sed 's/\,\n&/\,-999\n&/g' file_name 
+0

спасибо вам оба (@anubhava), но ни один из предлагаемого решения не изменилось ничего =/ –

+0

Я отредактировал ответ, попробуйте сейчас – mirkobrankovic

1

Это SED должно работать:

sed -i.bak 's/, *$/&999/' file 
2

Вы можете сказать:

sed 's/,[^0-9]*$/,-999/' filename 
+0

Это сработало =) Thak you very much =) –

+0

Хорошо. Http: // StackOverflow.com/help/someone-answers – devnull

+0

Я думал, что это сработало, но вместо этого я получил дополнительную -999 в каждой строке, и в последней строке я получил: - 999 = ( Я также пробовал предложения awk, но без успеха –

0

Может быть, вы можете использовать AWK переменную разделителя, что-то вроде этого :

#!/usr/bin/awk -f 
BEGIN { 
    FS=","; 
    OFS=","; 
} 
{ 
    if ($11 == "") { 
        print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,"-999" 
    } else { 
        print $0 
    } 
} 
+0

@ user1993123: Изменен мой ответ после фактического тестирования первого ... – shodanex

2

С awk:

awk 'BEGIN{FS=OFS=","}{if($11==""){$11="-999"};print}' your.file 

Команда будет установлена ​​11-й столбец -999 если он пуст


Пользователь sudo_O предложил версию сценария выше, что следует той же логике, но выглядит намного чище:

awk '$11==""{$11=-999}1' FS=, OFS=, your.file 
+0

Черт, мой awk ржавый ... – shodanex

+0

это не сработало = ( –

+0

что не работает ? Я протестировал его с файлом, который вы разместили в своем вопросе. – hek2mgl

0
$ awk '{print $0 (/,$/?-999:"")}' file 
22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0 
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0 
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3 
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999 

или если вы любите гольф:

$ awk '/,$/{$0=$0"-999"}1' file 
22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0 
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0 
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3 
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999 

Лично я бы просто использовать один из посланных простых SED решений для этого, например, @ Анубхав-х

0

Это может работать для вас (GNU СЭДА):

sed -r 's/[^,]+/&/11;t;s/$/-999/' file 

Если нет одиннадцатого поля добавить -999