У меня есть входной файл, имеющий 11 столбцов, и эти файлы нужно обработать, вывести первые столбцы, последние 2 цифры и распечатать остальные столбцы. Поля разделены запятыми. Я пробовал некоторые команды, но не получил должного результата.Нужен сценарий оболочки для этого моего файла, имеющего больше записей

вход

9303176179,989303176179,15335,A,1,9,1,0,201712091400,0,0
9303138379,989303138379,15335,A,1,9,1,0,201712091400,0,0
9302922849,989302922849,15335,A,1,9,1,0,201712091400,0,0
9334284759,989334284759,15335,A,1,9,1,0,201712091400,0,0
9334200459,989334200459,15335,A,1,9,1,0,201712091400,0,0
9334022869,989334022869,15335,A,1,9,1,0,201712091400,0,0
9334499819,989334499819,15335,A,1,9,1,0,201712091400,0,0
9334036329,989334036329,15335,A,1,9,1,0,201712091400,0,0
9303053859,989303053859,15335,A,1,9,1,0,201712091400,0,0
9302997519,989302997519,15335,A,1,9,1,0,201712091400,0,0

Ожидаемый выход

79,989303176179,15335,A,1,9,1,0,201712091400,0,0
79,989303138379,15335,A,1,9,1,0,201712091400,0,0
49,989302922849,15335,A,1,9,1,0,201712091400,0,0
59,989334284759,15335,A,1,9,1,0,201712091400,0,0
59,989334200459,15335,A,1,9,1,0,201712091400,0,0
69,989334022869,15335,A,1,9,1,0,201712091400,0,0
19,989334499819,15335,A,1,9,1,0,201712091400,0,0
29,989334036329,15335,A,1,9,1,0,201712091400,0,0
59,989303053859,15335,A,1,9,1,0,201712091400,0,0
19,989302997519,15335,A,1,9,1,0,201712091400,0,0

2 ответа2

2

Используйте cut и paste:

paste -d, <(cut -f1 -d, input.csv | rev | cut -c1,2 | rev) \
          <(cut -f2- -d, input.csv)

Поскольку cut не может посчитать символы справа, я использовал rev для возврата каждого числа в первом столбце, затем извлек первые два символа с помощью cut и вернулся назад.

2

Я не знаю, какие инструменты вы пробовали, но я использую sed для такого рода вещей:

sed 's/^[^,]*\([^,][^,],.*$\)/\1/g'

Вы можете использовать это как фильтр (sed ... <InFile >OutFile) или использовать опцию -i чтобы обновить имя файла, которое вы добавили бы в строку выполнения (sed -i ... InFile).

При этом выполняется поиск в каждой строке, ища последние два символа перед первой запятой, используя [^,] чтобы найти любой символ, кроме запятой. Затем он начинает поле совпадения перед этими двумя символами с \( и заканчивает поле совпадения в конце строки с \) . Затем это поле совпадения заменяет все выражение совпадения, которое начинается с начала строки.

Я обычно использую Регулярные выражения, поэтому я нахожу это простым, чтобы написать это, но я первый, кто признает, что их трудно выучить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .