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

Скорее всего, вы не сможете запустить его напрямую. Это двоичный файл, созданный для MacOS X, так что это то же самое, что пытаться запустить файлы Windows.exe в Linux.

Существуют способы использования двоичных файлов Mach -O, но это всегда эмулятор или что-то подобное (, например двоичные файлы Wine для Windows):https://github.com/shinh/maloaderилиhttp://www.darlinghq.org/

1
22.04.2020, 14:07
2 ответа

То же решение, на которое я ответил здесь , которое также применимо к вашему вопросу с небольшой модификацией здесь:

sed -E ':loop s/(\([^)]*),([^)]*\))/\1\2/; t loop' infile

Разрушение:

Примечание:un -escaped (или )вне класса символов [...]используется для группового сопоставления; экранированные \(или \)или внутри класса символов [...]будут соответствовать литералам (и ); ^соответствует отрицанию, поэтому [^)]соответствует "любому одиночному символу, но не )".

то имеем:

(\([^)]*):первый групповой матч, на который ссылается обратный референд \1.
,:соответствует одной запятой.
([^)]*\)):совпадение второй группы, задняя -ссылка \2.

Рассмотрим одну примерную строку, как показано ниже, и объясним, как работает это совпадение:

c(("4288", "57534", "somtoher")),d("f1", "f2", "f3"),MIB1

это (\([^)]*),([^)]*\))будет соответствовать:

  1. от самой первой открывающей скобки (, за которой следует что угодно, кроме )и вверх -до последней ,до первой закрывающей скобки ); таким образом, первое совпадение группы \1будет соответствовать (("4288", "57534",части строки выборки, приведенной выше;

  2. затем все, что находится после последнего ,до первой закрывающей скобки вверх -до первой закрывающей скобки и самого )будет во втором групповом совпадении \2; это будет "somtoher")часть приведенной выше строки образца.

  3. в замещающей части в \1\2мы возвращаем обе совпадающие группы обратно, но опускаем запятую между ними.

  4. :loop s///; t loop; выполняйте шаги с 1 по 3 до тех пор, пока все запятые между (и )не будут очищены в цикле sed(loopи не будут использоваться в качестве метки ).

    с первой попытки,наша строка образца изменится на:

    c(("4288", "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
    

    при второй попытке будет:

    c(("4288" "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
    

    с третьей попытки будет:

    c(("4288" "57534" "somtoher")),d("f1", "f2" "f3"),MIB1
    

    и так далее.

0
19.03.2021, 02:27

Использование perlвместо sedдля получения более сложных регулярных выражений:

perl -pe 's/(?:\G[^,)]*|\([^,)]*)\K,(?=.*?\))//g' input.csv
c("4288" "57534"),MIB1
c("2272" "2385"),FHIT
c("5550" "10531" "56239"),PREP
c("25809" "23669"),TTLL1

Это удалит все запятые внутри скобок.

0
19.03.2021, 02:27

Теги

Похожие вопросы