Давайте попробуем реализовать команду sed
Давайте рассмотрим пример CSV-файла со следующим содержимым:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Чтобы удалить 1-е поле или столбец :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Это регулярное выражение ищет последовательность символов без запятой([^,]*) и удаляет их, что приводит к удалению 1-го поля.
- Для печати только последнего поля ИЛИ удаления всех полей, кроме последнего поля:
$ sed 's/.*,//' file
11
2
3
4
5
Это регулярное выражение удаляет все до последней запятой (.*,), что приводит к удалению всех полей, кроме последнего поля.
- Для печати только 1-го поля:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Это регулярное выражение(,.*) удаляет символы, начиная с 1-й запятой до конца, в результате чего удаляются все поля, кроме последнего поля.
- Чтобы удалить 2-е поле:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
Регулярное выражение (,[^,]*,) выполняет поиск запятой и последовательности символов, за которыми следует запятая, что приводит к совпадению со 2-м столбцом, и заменяет этот шаблон, соответствующий только запятой, в конечном итоге завершается удалением 2-го столбца.
Примечание: Удаление полей в середине становится более сложным в sed, так как каждое поле должно быть сопоставлено буквально.
- Для печати только 2-го поля:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
Регулярное выражение соответствует первому полю, второму полю и остальным, однако группирует только 2-е поле. Вся строка теперь заменена 2-м полем(\1), поэтому отображается только 2-е поле.
- Печатайте только строки, в которых последний столбец представляет собой однозначное число:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Регулярное выражение (,[0-9]$) проверяет наличие одной цифры в последнем поле, и команда p выводит строку, соответствующую этому условию.
- Чтобы пронумеровать все строки в файле:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
Это имитация команды cat-n. awk делает это легко, используя специальную переменную NR. Команда " = " sed задает номер строки каждой строки, за которой следует сама строка. Выходные данные sed передаются по конвейеру в другую команду sed для соединения каждые 2 строки.
- Замените последнее поле на 99, если 1 - е поле - "Ubuntu".:
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Это регулярное выражение соответствует "Ubuntu" и до конца, за исключением последнего столбца, а также группирует каждый из них. В заменяемой детали заменяются 1-я и 2-я группы вместе с новым номером 99.
- Удалите 2-е поле, если 1-е поле "RedHat":
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
1-е поле "RedHat", 2-е поле и остальные поля сгруппированы, и замена выполняется только 1-й и последней группой , что приводит к удалению 2-го поля.
- Чтобы вставить новый столбец в конце(последний столбец) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
Регулярное выражение (.*) соответствует всей строке и заменяет ее самой строкой (&) и новым полем.
- Чтобы вставить новый столбец в начало(1 - й столбец):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Как и в предыдущем примере, только за совпадающей строкой следует новый столбец
Я надеюсь, что это поможет. Дайте мне знать, если вам нужно использовать Awk или любую другую команду.
Спасибо
sed -Ei "$rownum s/$newvalue/$col" file.csv
и это вызвало ошибку, но хотелось бы узнать об этом больше. Также был бы полезен любой ресурс для чтения.