Как добавить последний столбец каждой второй строки с последним столбцом следующей строки - PullRequest
2 голосов
/ 19 апреля 2019

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

Необработанные данные:

user|396012_232|program|30720Mn|
|396012_232.batch|batch|30720Mn|5108656K
user|398498_2|program|102400Mn|
|398498_2.batch|batch|102400Mn|36426336K
user|391983_233|program|30720Mn|
|391983_233.batch|batch|30720Mn|5050424K

Я бы хотел взять последнее поле в строках "партии" и добавить строку над ним с последним полем в строке "партии".

Желаемый вывод:

user|396012_232|program|30720Mn|5108656K
|396012_232.batch|batch|30720Mn|5108656K
user|398498_2|program|102400Mn|36426336K
|398498_2.batch|batch|102400Mn|36426336K
user|391983_233|program|30720Mn|5050424K
|391983_233.batch|batch|30720Mn|5050424K

«Пакетные» строки затем удаляются из выходных данных, поэтому в этих строках нет предпочтения, если строка вырезается, копируется или изменяется каким-либо образом.

Там, где я был озадачен, мои попытки закончить логику были смущающе нелогичны:

awk 'BEGIN{OFS="|"} {FS="|"} {if ($3=="batch") {a=$5} else {} ' file.data

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Если вам не нужно сохранять строки с batch в поле 3, вы можете использовать

awk 'BEGIN{OFS=FS="|"} NR%2==1 { prev=$0 }; $3=="batch" { print prev $5 }' file.data

или

awk 'BEGIN{OFS=FS="|"} NR%2==1 { prev=$0 }; NR%2==0 { print prev $5 }' file.data

См. онлайн awk демо и другое демо .

Детали

  • BEGIN{OFS=FS="|"} - устанавливает разделитель поля на трубу
  • NR%2==1 { prev=$0 }; - сохраняет нечетные строки в prev переменная
  • $3=="batch" - проверяет, равно ли поле 3 batch (возможно, с помощью этой логики вы можете заменить его на NR%2==0, чтобы получить четную линию)
  • { print prev $5 } - печатает предыдущую строку и поле 5.

Вы можете также рассмотреть вариант sed:

sed 'N;s/\x0A.*|\([^|]*\)$/\1/' file.data > newfile

См. это демо

Детали

  • N; - добавляет новую строку в пространство шаблона, а затем добавляет следующую строку ввод в пространство шаблона и если больше нет ввода, то sed выходит без обработки больше команд
  • s/\x0A.*|\([^|]*\)$/\1/ - заменяет содержимое группы 1 a
    • \x0A - новая строка
    • .*| - любые 0+ символов до последних | и
    • \([^|]*\) - (Группа захвата 1): любые 0+ символов, кроме |
    • $ - конец строки
0 голосов
/ 20 апреля 2019

если ваши данные в файле 'd', попробуйте gnu awk:

awk 'BEGIN{FS="|"} {if(getline n) {if(n~/batch/){b=split(n,a,"|");print $0 a[b]"\n"n} } }' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...