хэш % h
содержит данные, а массив @h
управляет порядком, в котором обнаружены элементы хэша. OTW, хеш-ключи будут выбраны в случайном порядке.
perl -F, -lane '
BEGIN{ $"=$,=","; }
push @{$h{"@F[-3..-1]"}}, $F[0];
$h[-1+keys %h] = "@F[-3..-1]";
END{ print @{$h{$_}}, $_ for @h; }
' yourcsvfile
sed -e '
:loop
$!N
s/^\(.*\)\(\(,[^,]*\)\{3\}\)\n\([^,]*\)\2$/\1,\4\2/
tloop
P;D
' yourcsvfile
sed \$G yourcsvfile | # we add a dummy line to signal last record has been processed
while IFS=, read -r -a A; do
var=${A[@]: -3:3}
var=${var// /,}
case $var in
"$prev" ) x=${x-}${x:+,}${A[0]} ;;
* ) case $prev in ?* ) echo "$x,$prev" ;; esac; prev=$var; x=${A[0]} ;;
esac
done
Вообще, EOF - это не символ, это отсутствие символа.
Если программа работает на терминале в каноническом режиме с настройками по умолчанию (т.е. обычная программа на C, которая просто использует stdio), она никогда не увидит ASCII символ EOT. Драйвер терминала распознает этот символ и создает условие EOF (которое на низком уровне является значением 0, возвращаемым из read()
). Библиотека stdio преобразует это условие EOF в возвращаемое значение, соответствующее данной функции (макрос EOF
для getchar()
, нулевой указатель для fgets()
и т.д.). )
Числовое значение макроса EOF
не имеет значения нигде, кроме библиотеки Си, и не должно влиять на ваше понимание смысла условия EOF.
EOF
в контексте C - это просто то, что не может появиться в файле. EOT
- это символ ASCII, который исторически сигнализировал об окончании сообщения (и является специальным символом в терминалах UNIX, который означает конец потока , когда он появляется только при вводе пользователем ), но он CAN появляется в файлах, поэтому использование его в C для обозначения конца файла было бы ужасной идеей при чтении двоичных файлов!
EOT - это один из нескольких управляющих символов, используемых провидческими устройствами. Есть ряд других управляющих символов, которые связаны с передачей данных по последовательным линиям или хранением файлов на последовательном источнике, таком как бумажная лента. К ним относятся такие символы, как SOH, STX, ETX, FS, RS, GS и, US. Дополнительные управляющие символы используются для управления трансмиссией и исправления ошибок.
В последовательном соединении символ EOT (конец передачи) указывает на желание завершить передачу. Последовательные соединения обычно доступны с помощью файлового драйвера. Когда последовательная передача завершается, файловый драйвер сообщает об этом как о состоянии EOF (конец файла).
EOF - это не персонаж. getchar () возвращает целое число. Допустимый символ while будет иметь значение в диапазоне от 0 до 255. Значение -1 часто используется как индикатор ложного / недействительного / сбоя в Unix / Linux. (На самом деле значение не 0, так как существует множество причин для неудачи, но обычно только один случай успеха.) Когда getchar () возвращает -1, очевидно, что это не возвращает символ.Однако, если вы сохраните вывод в байтах, вы не сможете отличить EOF от символа DEL (Удалить).