#bash #shell
#bash #оболочка
Вопрос:
Я пытаюсь создать сценарий оболочки, который считывает приведенный ниже входной файл и добавляет цифры, которые присутствуют с индексом 2-4 в каждой строке, к индексу с 8 по 10 в каждой строке.
Входной файл (input.txt )
1234567
1278980
54279
Выходной файл: (обратите внимание, что цифры в позиции 2-4 в каждой строке были добавлены к позиции 8-10 в той же строке)
Output.txt
1234567234
1278980278
54279 427
Мой текущий код показан ниже. В этом коде я могу извлекать только цифры с индексом 2-4 каждой строки, но не могу добавить их с индексом от 8 до 10 для каждой строки в том же файле.
awk '{val=substr($0,2,3)} (val 0)>=0 {print $0}' input.txt > filtered_digits.txt
Может кто-нибудь помочь мне достичь этого в том же коде сценария?
Спасибо вам всем.
Комментарии:
1.
(val 0)>=0
? Почему?index 2 to 4
ваш вывод предполагает, что вам нужны 3 символа, ваш awk предполагает, что вам нужны 2 символа. Итак, индекс от 2 до 4 включительно?2. Да, с индексом 2-4 включительно. Я обновил код в вопросе. Я хочу иметь возможность обновлять то же самое input.txt файл и создайте output.txt файл
Ответ №1:
Это просто:
awk '{val=substr($0,2,3)} {print $0 val}'
awk '{print $0 substr($0,2,3)}'
# even just (with nonempty input):
awk '$0 = $0 substr($0,2,3)'
или с помощью sed:
sed 's/(..(...)..)/12/'
Но если у меня есть строка всего из 4 символов
Вы могли бы выровнять по левому краю $0
с пробелами до 7:
awk '$0 = sprintf("%-7s", $0) substr($0,2,3)'
Комментарии:
1. Я хочу добавить его, начиная с индекса с 8 по 10. Я не уверен, что понимаю, как ваш код учитывает это? Не могли бы вы, пожалуйста, объяснить?
2. Не могли бы вы ответить?
3. Ваш входной файл содержит 7 символов, поэтому я просто добавляю его.
4. Но если у меня есть строка всего из 4 символов, тогда метод суффикса не будет работать. правильно? Это проблема, с которой я также сталкиваюсь, поскольку я также хочу сделать интервал в awk cmd
Ответ №2:
Если вы хотите отформатировать свой вывод, например
printf "%-7s%sn" 12345 123
12345 123
Вы можете использовать
sed -r 's/.(..).*/printf "%-7s%sn" "amp;" "1"/e' input.txt