Заполните пустые строки в определенном столбце значениями

У меня есть данные следующего формата:

2342 1 6473 2 7463 2 3647 2734 1 9343 

Строки, которые не имеют значения во втором столбце, пусты в этом месте (т. Е. Нет места, вкладки и т. Д.). Я ищу простую команду, которая помещает '-9' в открытые места столбца 2.

(В основном команда awk которая проверяет, отлична ли строка в столбце 2, а затем добавляет «-9», если это так, я должен сказать …)

Расширенный пример (данные с большим количеством столбцов, некоторые из которых содержат пропуски). Я только хочу добавить '-9' в последний столбец (то есть другим столбцам разрешено иметь пропуски).

 2342 0 12 1 6473 13 2 7463 0 14 2 3647 0 2734 0 1 9343 0 16 

4 Solutions collect form web for “Заполните пустые строки в определенном столбце значениями”

Если ваши данные выражены в столбцах с фиксированной шириной, вы можете сделать следующее:

Для первого случая:

 sed 's/^.\{4\}$/& -9/' 

(добавьте " -9" к строкам из 4 символов).

Для второго случая:

 sed -e '/.\{11\}/b' -e 's/$/ /;s/\(.\{10\}\).*/\1-9/' 

(добавить до 10 пробелов и -9 до строк менее 11 символов).

Как правило, для разбора строк с полями с фиксированной шириной, см. Специальную переменную FIELDWIDTHS для GNU awk .

С помощью GNU sed

 sed ':;s/^.\{0,9\}$/& /;t;s/^.\{10\}$/&-9/' file 

Добавляет одно пробел, если число символов меньше десяти, используя тест t .
Затем заменяет строки с десятью символами и -9.

Вы можете попробовать с этим awk с первым примером:

 awk 'NF == 1 { $2 = -9; } 1' file 

Как упоминалось в других сообщениях с gawk вы можете использовать FIELDWIDTHS , так что вы можете попробовать это со своим вторым:

 gawk 'BEGIN { FIELDWIDTHS = "4 1 1 1 2 1 1"} { for (i = 1; i <= NF; i++) { if ($i == "") { if (i == 7) $i = "-9"; else $i = " "; } } printf("%s %s %s %s\n", $1, $3, $5, $7); }' file 

Вы можете использовать это:

 perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}' 

Эта команда считывает вашу строку ввода и печатает «-9» во втором столбце, если она пуста.

 echo "2342 1 6473 2 7463 2 3647 2734 1 9343" | perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}' 2342 1 6473 2 7463 2 3647 -9 2734 1 9343 -9 
  • Сравните несколько файлов и печать сходства и различий
  • Обработка текста для извлечения полей структуры
  • Назначение определенной строки из переменной в другую переменную
  • Как получить последние три последние даты файла журнала?
  • печать специальных символов в awk-выходе
  • Как вставить переменные bash в awk?
  • Скользящее среднее в файле журнала с awk или другими утилитами unix?
  • изменить конкретный столбец с помощью sed или awk
  • Преобразование генотипов в 0/1
  • Sed / Awk - найти строку длиной ровно n символов
  • Awk - выводит вторую строку из нескольких файлов .dat в один файл
  • Grep / awk / sed для строк, состоящих только из двух букв, и строк, начинающихся с буквы и встречающих определенную длину
  • Linux и Unix - лучшая ОС в мире.