Как перенестись, запятая разграничила значения к следующей строке, не нарушая другие поля с помощью awk или ksh

У меня была очень похожая проблема с 13,04 (но она вместо этого жаловалась что openssh-client быть установленным является БОЛЕЕ НОВЫМ, чем требуемый тот).

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

Я решил его путем открытия приложения Ubuntu Software Center, затем движения в "Редактирование> Источники программного обеспечения", затем на вкладке Ubuntu Software я изменяю Donwload с выпадающего списка на "Основной Сервер".

Я затем работал sudo apt-get update сопровождаемый sudo apt-get upgrade и наконец sudo apt-get install openssh-server и на этот раз это установило без помехи.

3
25.10.2014, 04:05
2 ответа

Вы можете использовать SED , подобный этому:

    sed 'h;s/,[^|]*//g;x
    /,/{s/|[^,|]*,*/|-/g;H;}
    x;s/-\([^|]\)/\1/g;P;D'

Это завело, будучи относительно простым в конце концов. Применение того, что маленький сценарий к вашим данным получает:

key1|0|11881|0|0|0|0|11769|0|0|0
key2|2027|345|0|1|0|2040|364|0|1|0
key2|-|712|-|-|-|-|729|-|-|-
key3|0|670944|0|0|0|0|495554|0|0|0
key4|1847|1|0|0|0|1814|1|0|0|0
key4|-|21|-|-|-|-|22|-|-|-
key5|1880|11|0|154|0|1886|11|0|151|0
key5|-|402|-|-|-|-|397|-|-|-
key6|1|65|0|8|0|16684|51|0|8|0
key6|1|4570|-|-|-|0|4176|-|-|-
key6|19137|-|-|-|-|-|-|-|-|-
key7|1851|11|0|202|0|1856|13|0|193|0
key7|-|757|-|-|-|-|751|-|-|-

в основном SED просто решает каждое поле с обоих концов. Сначала он экономит копию своей текущей итерации в H старого пространства. Затем SED удаляет все, от каждого поля после первой запятой. После этого SED выключается обратно к сохраненной копии, поэтому он может удалить поле, которое он просто сохранен в другом буфере.

Если запятые остаются, добавляет вторую копию к первому следующему вставленным \ N символ EWLINE, так что он может резать как минимум еще раз, когда P; D P Rint Затем D Elete только до первого происхождения \ N символ EWLine в области шаблона перед началом с тем, что остается.

2
27.01.2020, 21:19

Я бы не использовал awk для этого, потому что я думаю, что ему нужны более гибкие структуры данных. Я бы использовал Perl:

perl -MList::Util=max -F'\|' -lane '
    $key = shift @F;
    @data = map {[split /,/]} @F;
    do {
        @row = map {shift(@$_) // "-"} @data;
        print join("|", $key, @row);
        $max = max map {scalar @$_} @data;
    } while ($max > 0);
' file
key1|0|11881|0|0|0|0|11769|0|0|0
key2|2027|345|0|1|0|2040|364|0|1|0
key2|-|712|-|-|-|-|729|-|-|-
key3|0|670944|0|0|0|0|495554|0|0|0
key4|1847|1|0|0|0|1814|1|0|0|0
key4|-|21|-|-|-|-|22|-|-|-
key5|1880|11|0|154|0|1886|11|0|151|0
key5|-|402|-|-|-|-|397|-|-|-
key6|1|65|0|8|0|16684|51|0|8|0
key6|1|4570|-|-|-|0|4176|-|-|-
key6|19137|-|-|-|-|-|-|-|-|-
key7|1851|11|0|202|0|1856|13|0|193|0
key7|-|757|-|-|-|-|751|-|-|-
2
27.01.2020, 21:19

Теги

Похожие вопросы