
Я прочесывал здесь и в нескольких других местах, чтобы попытаться найти ответ на этот вопрос, но он кажется таким глупо простым, что никто не ответил на него. Все, что мне нужно сделать, это добавить одно значение в новый столбец в конце каждой строки. Самое близкое, что я нашел, это использование, sed -i "s/$/green/" ./test.txt
но это добавляет значение green в следующую строку, мне нужно добавить его как новый столбец после текущего последнего столбца
У меня есть такой файл:
chr - xyz ordered_A01 5480 6144
chr - xyz ordered_A01 5480 58001
Мне нужно, чтобы это выглядело так:
chr - xyz ordered_A01 5480 6144 green
chr - xyz ordered_A01 5480 58001 green
Но вместо этого я получаю это:
chr - xyz ordered_A01 5480 6144
green
chr - xyz ordered_A01 5480 5801
green
решение1
Команда sed, которую вы используете в своем вопросе, на самом деле верна. Если вы видите результат на новой строке, то либо ваш терминал настроен на узкий режим и вы видите только перенос, либо в вашей фактической среде есть код, который вы не показываете нам в этом примере. Он работает как есть, но есть две проблемы, о которых вы должны знать:
Использование
$
в качестве части выражения внутри строки в двойных кавычках опасно. Обычно это расширяется как переменная bash. В этом случае вам это сошло с рук, потому что символ/
после него не является допустимым ценным именем, но чтобы избежать этого, вам действительно следовало использовать одинарные кавычки вокруг вашего выражения.Если вы хотите выровнять элементы как столбцы, вам, вероятно, следует включить какой-то разделитель между концом строки и значением, которое вы добавляете. Табуляция может быть самым простым способом сделать это, но вам, вероятно, следует использовать любой разделитель, который у вас уже есть между другими полями.
В совокупности фиксированная команда может выглядеть примерно так:
sed -i 's/$/\tgreen/' ./test.txt
Если результаты не выстраиваются так, как вам хотелось бы, вы можете рассмотреть возможность передачи данных по конвейеру col
для выравнивания столбцов.
Что касается вещей, которые вы нам не показываете, проблема, вероятно, в вашем файле данных. Поскольку вы упоминаете Wordpad и Excel в комментарии. Я полагаю, у вас смешанная среда Windows/Unix. Я подозреваю, что проблема в том, что ваш файл данных содержит мусорные непечатаемые последовательности перед концом ваших строк. Вам следует что-то сделать, чтобы это очистить. Простым sed 's/\s*$//'
может быть одно место, с которого можно начать (полосы всех пробельных символов в конце строки, кроме последнего символа новой строки), но более продвинутая система, такая как конвертер dos2unix, может дать вам лучшие результаты. Если у вас там есть двоичный мусор, а файл должен быть текстом ASCI, вы можете попробовать уничтожить все, что находится за пределами диапазона, с помощью tr -cd '\11\12\15\40-\176'
.
решение2
Вы можете использовать awk
:
awk '{printf "%s", $0 "\tgreen\n"}' infile > outfile
решение3
Вы можете использовать Vim в режиме Ex:
ex -sc '%s/$/\tgreen/|x' test.txt
%
выбрать все строки\t
вкладкаx
сохрани и закрой