Как объединить последние четыре столбца текстового файла при вставке другого разделителя?

Есть 2 возможности. smartctl -cперечислит возможности устройства, включая такие строки, как

Short self-test routine 
recommended polling time:      (   1) minutes.
Extended self-test routine
recommended polling time:      (  48) minutes.

Таким образом, вы можете просто прочитать их и поспать необходимое короткое или долгое время.

Во-вторых, во время выполнения теста та же самая опция -cбудет отображать текущий статус любого теста, например:

Offline data collection status:  (0x03) Offline data collection activity
  is in progress.
Self-test execution status:      ( 247) Self-test routine in progress...
  70% of test remaining.
Total time to complete Offline 
data collection:    (   44) seconds.

Таким образом, вы можете опрашивать каждые несколько минут и ждать, пока оставшееся время вернется к 0, а другие поля получат свои окончательные значения:

Offline data collection status:  (0x02) Offline data collection activity
  was completed without error.
Self-test execution status:      (   0) The previous self-test routine completed
  without error or no self-test has ever 
  been run.
Total time to complete Offline 
data collection:    (    0) seconds.
0
17.08.2019, 09:01
3 ответа

Рассмотрим следующий awk-скрипт:

awk 'BEGIN { IFS=OFS="\t" }
     NR==1 { print "sample_1" OFS "sample_2" OFS "sample_3" OFS "info" }
     NR >1 { four=$4
             for(i=5; i <= NF; i++) four=four"|"$i
             print $1 OFS $2 OFS $3 OFS four }' input

Сценарий состоит из трех разделов:

  1. BEGIN--перед тем, как скрипт прочитает любой ввод, он устанавливает разделитель полей ввода -и вывода -как TAB.
  2. NR==1--это переписывает заголовок, как вы показали.
  3. NR >1--это сворачивает поля четыре и далее для объединения с вкладками (OFS ). Он делает это, инициализируя новое значение полем #4; затем он перебирает оставшиеся поля и добавляет к их значениям символ вертикальной черты. После завершения цикла он печатает заново собранную строку.
1
28.01.2020, 03:21

Быстро и грязно с GNU sed, при условии, что ни одна из ваших строк не имеет пробелов в конце:

$ sed -E -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file
sample_1   sample_2   sample_3   info
52         59         80         wild|animal|herbe|small
25         65         71         pet|insect

Если в строках есть пробелы в конце, вы можете сначала удалить их:

sed -E -e 's/ +$//' -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file
0
28.01.2020, 03:21

Пробовал с помощью приведенной ниже команды, все работает нормально

awk 'NR >1{$4=$4$5$6$7;$5=$6=$6=$7="";print $0}' filename| sed '1i sample_1   sample_2   sample_3   info '| awk '{printf "%s%10s%10s%30s\n",$1,$2,$3,$4}'

выход

sample_1  sample_2  sample_3            info
52        59        80          wildanimalherbesmall
25        65        71                     petinsect
-1
28.01.2020, 03:21

Теги

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