Запускать sed с определенной координаты в кадре данных (с разделителями табуляции) через gitbash - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть несколько файлов, к которым я хочу применить эту опцию, если она доступна.

Мой коллега разработал Perl-скрипт для получения доли уникальных символов / строк в файле, начинающихся с определенной координаты, он работает так:

$./perlscript.pl --f=<File.gz> --r=<row start> --c=<col start> > outputfile

Это замечательно, поскольку позволяет обрабатывать файлы разных размеров и размеров.

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

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

чтобы получить «AB» и «CD» из «AB» и «CD», я должен указать сценарию заменить «AB» для «AB» и «CD» для «CD» по отдельности.

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

Это не обязательно должно быть исключительно с sed, это также может быть скрипт на perl или функция awk.

1 Ответ

0 голосов
/ 14 ноября 2018

Вопрос, кажется, сводится к:

Вы хотите просто удалить все пробелы в конце каждого поля, разделенного табуляцией?

Да, не затрагивая первый столбец и первую строку, поскольку это поля метаданных

Предполагая, что вам не нужно беспокоиться о каких-либо полях со встроенными вкладками (если вы захотите, вам понадобится решение с реальным парсером CSV):

Пропуск первого столбца и первого ряда делает его немного более сложным, но все же его можно сделать несколько громоздким: 1 1011 *

$ cat a.tsv
foo     bar     baz
ab  bc  de
1   1   3
$ xxd a.tsv
00000000: 666f 6f20 0962 6172 2009 6261 7a0a 6162  foo .bar .baz.ab
00000010: 2009 6263 2009 6465 0a31 2020 0931 2020   .bc .de.1  .1  
00000020: 0933 0a                                  .3.
$ perl -pe 'if ($. > 1) { my @f = split /\t/; $_ = join "\t", $f[0], map { s/ +$//; $_ } @f[1..$#f] }' a.tsv | xxd
00000000: 666f 6f20 0962 6172 2009 6261 7a0a 6162  foo .bar .baz.ab
00000010: 2009 6263 0964 650a 3120 2009 3109 330a   .bc.de.1  .1.3.

Вы можете видеть завершающие пробелы в полях, отличных от первой строки, и первый столбец в следующих строках был удален.

Если вы хотите редактировать файлы дерева каталогов на месте:

$ find /path/to/the/dir/ -name "*.tsv" -exec perl -pi -e 'if ($. > 1) { my @f = split /\t/; $_ = join "\t", $f[0], map { s/ +$//; $_ } @f[1..$#f] }' \{\} \;
...