$ echo '1,2,subjects,\mat\hs,unix\,\Nato,\N,123,\N' |
sed -r -e 's/\\N/XELI/g' |
sed -e 's/\\/#/g' |
sed -e 's/XELI/\\N/g'
1,2,subjects,#mat#hs,unix#,\Nato,\N,123,\N
Я нахожу, что он больше четко разделяет его:
Это именно то, в чем хорош awk
:
awk -F'\t' -vOFS='\t' '{ $9 = "test=" $9 ";" }1'
-F '\ t'
указывает ему использовать поля, разделенные табуляцией. -vOFS = '\ t'
указывает ему также использовать вкладки в выводе. Фактическое его тело - последний аргумент: это небольшая программа, которая говорит, что для каждой строки необходимо изменить значение $ 9
(девятое поле) на конкатенацию «test =», его исходное значение и ";". Мы оставляем все остальные поля нетронутыми. Последний 1
указывает awk
выводить новую строку, даже если мы что-то с ней сделали.
Если я дам ему ваш ввод (со вставленными вкладками):
$ cat data
1 2 3 4 5 6 7 8 text still more text in this column 10
1 2 3 4 5 6 7 8 text2 still more text in this column 10
, то я могу запустить указанную выше команду:
$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data
1 2 3 4 5 6 7 8 test=text; still more text in this column 10
1 2 3 4 5 6 7 8 test=text2; still more text in this column 10
и получить желаемый результат. Вы можете сохранить это в файл с перенаправлением >
:
$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data > processed-data
В GNU sed
:
sed 's/[^\t]*/text=&;/9'
то есть замените 9-ю последовательность символов без табуляции на text = &;
(где &
означает совпавшую часть).
В системах с другими реализациями sed
вам может потребоваться ввести символ табуляции буквально вместо \ t
.