Я хочу написать сценарий bash для отделения символов от специальных символов?

Вы можете попробовать следующее:

perl -pae '
   last if eof;
   my($M, $N) = ("@F[0..4]", $,.<>);
   print,$_=$N,@F=split,redo if substr($N,0,length($M)) ne $M;
   $_ = ($_, $N)[s/NA/NA/g > $N =~ s//NA/g];
' file

.

sed -Ee '
   $!N
   /^((\S+\s+){5}).*\n\1/!{P;D;}
   h;s/.*/ & /
   :a;s/ NA (.*\n.*) NA / \1 /;ta
   /\n.* NA /bb
   g;s/.*\n//;b
   :b;g;s/\n.*//
' file

Результаты

India 07 1800 BAHRAICH 42273 +28.4 +26.7 NA 997.1 1 NA NA
India 07 1800 BALASORE 42895 +29.0 +26.8 NA 999.7 NA NA NA
India 07 1800 BANGALORE 43295 +23.0 +17.4 908.1 geopotential_of_850mb_=_492 Trace NA NA
India 07 1800 BAREILLY 42189 +28.4 +26.2 NA 997.4 Trace NA NA
India 07 1800 BARMER 42435 +35.6 +22.6 NA 997.6 NA NA NA
India 07 1800 BHOPAL_BAIRAGHAR 42667 +23.6 +23.3 942.7 1000.5 13 NA NA
India 07 1800 BHUBANESHWAR 42971 +28.0 +25.7 NA 1000.7 NA NA NA
India 07 1800 BHUJ-RUDRAMATA 42634 +29.6 +25.7 NA 999.5 NA NA NA
India 07 1800 BIKANER 42165 +33.8 +25.1 NA 994.0 NA NA NA
India 07 1800 BOMBAY_SANTACRUZ 43003 +29.0 +26.8 NA 1004.4 10 NA NA
1
28.10.2020, 13:23
3 ответа

Я предполагаю, что под специальными символами вы подразумеваете не буквенно-цифровые символы? Если да, то вот что я придумал. У меня есть файл с именем testкоторый содержит:

1234: 2271' 4423'
8901 1234 2569?
1234@ 5678! 9107:
1134 7896 6780

Если я побегу cat test | tr -d '[:alnum:]'Я получаю этот вывод:

: ' '
  ?
@ ! :

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

grep -o '[A-Za-z0-9]*' test

Я не думаю, что вам нужно перебирать каждую строку.

1
18.03.2021, 22:54

С помощью GNU awkвы могли бы сделать что-то вроде:

gawk '
  BEGIN {
    n = split("alpha digit punct space", class)
    RS = ".{1}"; ORS = ""
  }
  {
    for (i = 1; i <= n; i++) if (RT ~ "^[[:" class[i] ":]]$") {
      print RT > (class[i] ".txt")
      next
    }
    print RT > "other.txt"
  }' < input.txt

Чтобы отсортировать символы по alpha.txt, digit.txt, punct.txt, space.txt, other.txtв зависимости от того, к какому классу они относятся в текущей локали.

Обратите внимание, что, несмотря на название, класс alphaпредназначен не только для символов алфавитного письма. Обычно он включает символы, составляющие слова человеческих языков, даже из тех алфавитов, которые не являются алфавитными. В локалях GNU он также включает цифры нескольких систем счисления (, за исключением английских 0123456789, которые являются единственными, совпадающими с классом digit). В некоторых других системах digitвключает все виды цифр (, но только из десятичной системы счисления ), а alphaнет. В любом случае alnumравно alpha+ digit. Стандарт C, а вскоре и POSIX , используют подход GNU.

1
18.03.2021, 22:54

Для полноты картины вот один -вкладыш.

cat file.txt  | tee  >(tr -d -C  '[:alpha:]'>char.txt) | tr -d '[:alpha:]'>specialchar.txt

В этом примере используется teeдля дублирования вывода в два разных процесса.

Во-первых, это tr, который удаляет не -альфа-символы, (-C является "дополнением" или напротив ), а затем записывает этот вывод в имя файла.

Второй trпросто удаляет альфа-символы, а остальные отправляет в другое имя файла.


По сути, это то же самое, что запустить все это дважды вот так:

cat filename | filter out nonalphas    > char.txt
cat filename | filter out alphas    > specialchar.txt

но это две отдельные команды, и входные данные могли измениться.

0
18.03.2021, 22:54

Теги

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