У меня есть файл A.txt(sep=","):

kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
,taq,205920777.1,A01,Unkn-01
,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

И я хочу добавить шаблон из строки 3 в первый столбец моего файла после строки 13, например:

kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

Хитрость заключается в том, чтобы установить «=» в качестве разделителя для B.txt, чтобы напечатать данные A.txt в $1 B.txt. Я пробовал такие вещи, как:

awk 'BEGIN{OFS=FS=" = "} NR==3{stuff} } 1' A.txt > B.txt

Но я не разобрался. Любые идеи?

Благодарность

1
nstatam 15 Июл 2020 в 09:40

2 ответа

Лучший ответ

Пытаться:

awk -F' = ' 'NR==3{a=$2} {if(NR<14)print; else print a $0}' A.txt

Используя ваш образец ввода:

$ awk -F' = ' 'NR==3{a=$2} {if(NR<14)print; else print a $0}' A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09

Многострочный формат

Для тех, кто предпочитает, чтобы их команды размещались в нескольких строках:

awk -F' = ' '
    NR==3{
        a=$2
    }

    {
        if(NR<14)
            print
        else
            print a $0
    }
    ' A.txt

Как это работает

  • -F' = '

    Это устанавливает разделитель полей на =.

  • NR==3{a=$2}

    Для строки номер три это сохраняет второе поле в переменной a.

  • if(NR<14)print; else print a $0

    Для номера строки меньше 14 это печатает строку без изменений. Для остальных строк печатается строка с переменной a перед ней.

Обновление: добавление времени из строк 14 ко всем строкам, кроме последних четырех.

awk -F' = ' 'NR==3{t=$2} NR<14{print;next} NR>17{print t d} {d=c;c=b;b=a;a=$0} END{print d ORS c ORS b ORS a}' A.txt

Пример входного файла:

$ cat A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
,taq,205920777.1,A01,Unkn-01
,taq,neg5,A02,Unkn-09
end1
end2
end3
end4

Соответствующий вывод:

$ awk -F' = ' 'NR==3{t=$2} NR<14{print;next} NR>17{print t d} {d=c;c=b;b=a;a=$0} END{print d ORS c ORS b ORS a}' A.txt
kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09
end1
end2
end3
end4
2
AdminBee 15 Июл 2020 в 10:53
Спасибо за подробный ответ, это здорово! Но в конце моего файла у меня есть 4 строки (2 в моем примере), где я не должен печатать данные: Могу ли я что-то сделать с tail -n+4?
 – 
nstatam
15 Июл 2020 в 10:05
В ПОРЯДКЕ. Я не уверен, что знаю, о чем вы спрашиваете, но если вы хотите отрезать (удалить) последние 4 строки вывода, используйте head -n-4
 – 
John1024
15 Июл 2020 в 10:15
Вы хотите удалить последние 4 строки или оставить их без изменений? Есть ли какая-то отличительная особенность этих линий? Похоже, что в строках, которые вы хотите изменить, есть taq. В последних 4 строках не хватает taq?
 – 
John1024
15 Июл 2020 в 10:18
Я не хочу обрезать, просто print $0 в этих строках
 – 
nstatam
15 Июл 2020 в 10:19
1
Спасибо, это идеально. Еще раз, спасибо за ваше время
 – 
nstatam
15 Июл 2020 в 11:55

Версия, не зависящая от линии

awk -F, -v OFS="," '$0~/UTC/{split($0,ar,"= ")}$2=="taq"{$1=ar[2]}1' file

kit
Software Version =
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
07/02/2020 13:44:11 UTC,taq,205920777.1,A01,Unkn-01
07/02/2020 13:44:11 UTC,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

Установите FS и OFS на ,, но разделите дату на массив ar в строке, где вы найдете UTC, а затем просто вставьте как $1 где угодно $2=="taq"

0
bu5hman 15 Июл 2020 в 10:11
К сожалению, это не единственная строка с шаблоном UTC, и $2 может иметь несколько шаблонов.
 – 
nstatam
15 Июл 2020 в 10:26