Nano Hash - криптовалюты, майнинг, программирование

Обнулить поля в файле с разделителями каналов

Я не могу получить желаемый o/p, когда в поле данных есть канал.

If the i/p is 
SAmple file is tst
hdr1|"hdr2|tst"|"hdr3|tst|tst"|hdr4|"hdr5|tst|tst"
lbl1|"lbl2|tst"|"lbl3|tst|tst"|lbl4|"lbl5|tst|tst"

I tried with this cmd but dont get the expected o/p - cut -f2,3 -d"|" tst

The expected o/p is 
"hdr2|tst"|"hdr3|tst|tst"
"lbl2|tst"|"lbl3|tst|tst"

Есть ли простой способ взломать это o/p... Не хочу использовать sed, потому что инструмент, который я использую, не позволяет использовать символ (- обратная косая черта). Я имею в виду, что я встраиваю эту команду в один из инструментов. Также я использую старую версию gawk -

so this cmd doesnt give te desired o/p
gawk -v FPAT='[^|]*|("[^"]*")+' '{print $2, $3}' OFS="|"

Output of gawk --version
GNU Awk 3.1.7

Output of cat -vet tst

hdr1|"hdr2|tst"|"hdr3|tst|tst"|hdr4|"hdr5|tst|tst"$
lbl1|"lbl2|tst"|"lbl3|tst|tst"|lbl4|"lbl5|tst|tst"$
10.08.2020

  • Похоже, это ошибка в вашей версии GNU awk с использованием FPAT. Согласно этому комментарию - stackoverflow.com/questions/49031764/, предложите обновить gawk до 4.2+, если вы используете FPAT 10.08.2020
  • Это не ошибка, просто FPAT не был представлен до gawk 4.0, а OP находится на gawk 3.1.7 (который устарел примерно на 10 лет!) 10.08.2020
  • @EdMorton: Ой! не знал этого. В любом случае обновление до последней версии является одним из вариантов для OP. 10.08.2020

Ответы:


1

Обновление вашей версии gawk, безусловно, является лучшим подходом, так как вам не хватает нескольких исправлений ошибок и тонны чрезвычайно полезных функций, появившихся с момента выхода gawk 3.1.7 более 10 лет назад (сейчас мы используем gawk версии 5.1!), но если вы не можете этого сделать по какой-то причине, вот что вы можете сделать, если у вас нет FPAT использования awk в любой оболочке на каждом компьютере UNIX:

$ cat tst.awk
BEGIN { OFS="|" }
{
    orig = $0
    $0 = i = ""
    while ( (orig != "") && match(orig,/[^|]*|("[^"]*")+/) ) {
        $(++i) = substr(orig,RSTART,RLENGTH)
        orig = substr(orig,RSTART+RLENGTH+1)
    }
    print $2, $3
}

.

$ awk -f tst.awk file
"hdr2|tst"|"hdr3|tst|tst"
"lbl2|tst"|"lbl3|tst|tst"

Просто чтобы убедиться, что он правильно идентифицирует все поля:

$ cat tst.awk
BEGIN { OFS="|" }
{
    orig = $0
    $0 = i = ""
    while ( (orig != "") && match(orig,/[^|]*|("[^"]*")+/) ) {
        $(++i) = substr(orig,RSTART,RLENGTH)
        orig = substr(orig,RSTART+RLENGTH+1)
    }

    print NF " <" $0 ">"
    for (i=1; i<=NF; i++) {
        print "\t" i " <" $i ">"
    }
}

.

$ awk -f tst.awk file
5 <hdr1|"hdr2|tst"|"hdr3|tst|tst"|hdr4|"hdr5|tst|tst">
        1 <hdr1>
        2 <"hdr2|tst">
        3 <"hdr3|tst|tst">
        4 <hdr4>
        5 <"hdr5|tst|tst">
5 <lbl1|"lbl2|tst"|"lbl3|tst|tst"|lbl4|"lbl5|tst|tst">
        1 <lbl1>
        2 <"lbl2|tst">
        3 <"lbl3|tst|tst">
        4 <lbl4>
        5 <"lbl5|tst|tst">
10.08.2020
  • Спасибо за ответ. Вместо создания (скрипт .awk) - есть ли другой способ получить желаемый результат или у нас есть альтернативный способ исправить это. 10.08.2020
  • Я не уверен, о чем вы спрашиваете, но если это то, как выполнить скрипт awk, не сохраняя его в файле, это просто awk 'script' file вместо awk -f tst.awk file. Посмотрите справочную страницу awk и попробуйте awk 'BEGIN{print "Hello World"}', если вы не уверены, что я имею в виду. 10.08.2020
  • Я получил это. Но мой вопрос был, есть ли ярлык, чтобы получить o/p 10.08.2020
  • Да, обновите версию gawk и используйте FPAT. В противном случае, я думаю, мы узнаем, если вы получите более короткие ответы. 10.08.2020
  • @AbdulWahabKhan, пожалуйста, прекратите вычищать ответы с нескольких форумов - похожие / те же самые моменты / комментарии уже были сделаны, и решение было предоставлено. 10.08.2020
  • @AbdulWahabKhan Мне любопытно, почему вас волнует, насколько короток сценарий? 10.08.2020

  • 2

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

    $ awk 'BEGIN{OFS=FS="\""} {for(i=2;i<NF;i+=2) gsub("\\|","~",$i)}1' file | 
      awk 'BEGIN{OFS=FS="|"}  {print $2,$3}'                                 | 
      sed 's/~/|/g' 
    
    "hdr2|tst"|"hdr3|tst|tst"
    "lbl2|tst"|"lbl3|tst|tst"
    

    Не уверен, что это проще, чем один скрипт awk.

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

    10.08.2020
  • ОП сказал, что любая среда, в которой они находятся, не позволяет им использовать обратную косую черту в сценариях (the tool that am using doesnt allow the charecter (""- backslash)), поэтому может потребоваться настройка или 2. Кстати, первый аргумент для gsub() - это регулярное выражение, а не строка, поэтому, если вы использовали регулярное выражение разделители, тогда вам не нужно было бы удваивать escape-последовательности (gsub(/\|/...) 10.08.2020
  • Новые материалы

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

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

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..