Как добавить столбцы в файл (предпочтительно с помощью sed -i), если столбец только один?

Как добавить столбцы в файл (предпочтительно с помощью sed -i), если столбец только один?

Допустим, у меня есть такой столбец данных:

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»)".

Связанный контент