Помогите с awk усечь и дополнить - PullRequest
1 голос
/ 27 марта 2011

У меня длинный список значений Unicode, разделенных точкой с запятой.Вот пример:

E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;

Все, что мне нужно, это "E0027;"part.

Итак, сначала мне нужно добавить все в строке ПОСЛЕ первой точки с запятой, но в некоторых случаях точка с запятой идет после 4 цифр, в других случаях (как указано выше) - после 5. Если это былото же самое повсюду я бы усек после фиксированного числа символов.Я нашел много примеров для выполнения различных манипуляций с awk, но нет регулярных выражений, которые бы подходили именно этому случаю.Кто-нибудь знает, что такое правильный синтаксис?Логика состоит в том, чтобы просто хранить все ДО первой точки с запятой и отбрасывать все после нее.

Затем для полученного файла мне нужно добавить начальный 0 в строку, если число составляет всего 4 символа.Так, например:

8A9B;

Должен стать:

08A9B;

Но 5-значные значения (как в первом примере) должны оставаться как есть ... без начального нуля.

(Хотя будет ли дополнительный начальный ноль иметь значение, если я использую эти значения в HTML? Было бы важно, если бы у меня было:

&#x0E0027

Вместо:

&#xE0027

Если они будут обрабатываться PHP одинаково и не будут иметь значения, я думаю, что последняя часть не так важна (хотя с тысячами дополнительных нулей это увеличит размер кода).

Заранее благодарю за любую помощь!

Ответы [ 5 ]

2 голосов
/ 27 марта 2011
awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'

Подтверждение концепции

$ echo "8A9B;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'
08A9B;

$ echo "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F';' '$0=length($1)<5?"0" $1 FS:$1 FS'
E0027;
0 голосов
/ 27 марта 2011
BEGIN {FS="\;"}

{print substr("0000" $1 FS, length($1),6)}

Введите:

E0027; TAG APOSTROPHE; Cf; 0; BN ;;;;; N ;;;;;
8A9B; TAG APOSTROPHE; Cf; 0; BN ;;;;; N ;;;;;

Из:

E0027;
08A9B;

Работает на ideone .

0 голосов
/ 27 марта 2011
$ echo "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" | awk -F";" '{ printf "%05s\n",$1 }'
E0027
0 голосов
/ 27 марта 2011

Редактировать: код Awk исправлен, чтобы оставить последний ';'

print -- "E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;" \
| awk '{
        #dbg print "$0=" $0
        sub(/;.*$/, ";")  # fixed here
        len=length($0)
        if (len == 5) {print "0" $0} # this was 4, now 5 with ';'
        else if (len == 6) {print $0} # 5 changed to 6
        else {print "error in input: found len=" len " in XX" $0 "xx"}
}'

Вы можете заменить print -- "... " | на cat file | ИЛИ избежать награды UUOC и удалить print -- "..." | И добавить inFileName > outFileName после последней ' программы awk.

Я не знаю ответа на ваш вопрос HTML.

Надеюсь, это поможет.

PS, поскольку вы, кажется, являетесь новым пользователем, если вы получите ответ, которыйПомогите вам, пожалуйста, не забудьте пометить его как принятый, или дать ему + (или -) в качестве полезного ответа

0 голосов
/ 27 марта 2011

Я не * nix человек, так что не очень знаком с awk. Однако, если решение php является приемлемым, как об этом:

$values = array();
$lines = file( '/path/to/file', FILE_SKIP_EMPTY_LINES );
foreach( $lines as $line )
{
    // get part before first occurence of ;
    $value = strstr( $line, ';', true ); 
    // pad the value, if applicable
    $value = str_pad( $value, 5, '0', STR_PAD_LEFT );
    // put it in the result array
    $values[] = $value;
}

И если одновременное чтение всего файла в память недопустимо, вы можете читать его построчно, конечно, с fopen(), fgets() и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...