Вы можете попробовать следующее:
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
Я предполагаю, что под специальными символами вы подразумеваете не буквенно-цифровые символы? Если да, то вот что я придумал. У меня есть файл с именем 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
Я не думаю, что вам нужно перебирать каждую строку.
С помощью 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.
Для полноты картины вот один -вкладыш.
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
но это две отдельные команды, и входные данные могли измениться.