Допустим, у меня есть такой столбец данных:
sample123
sample456
samplexyz
Я могу легко добавить два новых столбца, используя:
sed -i "s/$/\t1.1\tC/" <file.txt>
Теперь это:
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
Теперь предположим, что я добавляю новые данные внизу:
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
sampleNew1
sampleNew2
sampleNew3
Если я попытаюсь добавить новые столбцы для этих данных, они будут добавлены ко всем строкам, поэтому теперь, когда я запускаю:
sed -i "s/$/\t1.2\tA/" <file.txt>
Это выглядит как:
sample123 1.1 C 1.2 A
sample456 1.1 C 1.2 A
samplexyz 1.1 C 1.2 A
sampleNew1 1.2 A
sampleNew2 1.2 A
sampleNew3 1.2 A
Как добавить столбцы, если нет других столбцов, кроме первого?
решение1
Сначала проверьте, есть ли в текущей строке символ табуляции, и выполните замену только в том случае, если его нет:
sed -i '/\t/!s/$/\t1.2\tA/' file
Здесь мы обращаемся ко всем строкам, которые не содержат символ табуляции, /\t/!
и применяем замену к этим строкам.
Вышеизложенное предполагает, sed
что GNU может распознавать \t
как символ табуляции. Другим sed
реализациям может потребоваться использовать буквальный символ табуляции вместо \t
. Другие sed
реализации также могут обрабатывать эту -i
опцию иначе, чем GNU sed
(см. "Как добиться переносимости с помощью sed -i (редактирование на месте)?").
С использованием awk
:
awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
Это позволит проверить количество полей, разделенных табуляцией, и если имеется только одно поле, то перед печатью строки будут добавлены новое второе и третье поле.
Это не изменит файл на месте. Для этого используйте GNU, awk
например:
awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
Для получения дополнительной информации о awk
редактировании на месте см. "Как навсегда изменить файл с помощью awk? («редактирование на месте», как с помощью «sed -i»)".