У меня есть следующий кадр данных, который продолжается бесконечно по горизонтали и вертикали с отрицательными числами только в нечетных столбцах:
-1 2 3 4 -5 9
2 3 -4 5 -6 11
И я хочу, чтобы 2-й, 4-й и 6-й полные столбцы (или каждый четный столбец) и знаки минус только от 1-го, 3-го и 5-го (или каждого нечетного столбца), поэтому я получаю это:
- 2 4 - 9
3 - 5 - 11
И в конечном итоге в конечном итоге это:
-2 4 -9
3 -5 -11
Поэтому мне нужны значения из четных столбцов без изменений и из нечетных столбцов, если есть отрицательное значение, оставьте только - и, если есть положительное значение, отбросьте его.
Есть ли способ сделать это с помощью awk / sed?
Это примерно так:
awk '{ for (i=2;i<=NF;i+=2) $i="" }1' FILE.txt | sed 's/[0-9,.]*//g'
text-processing
sed
awk
Asfound
источник
источник
Ответы:
Вот один из способов:
awk
Скрипт переходит все нечетные столбцы и устанавливает их значение ,-
если они являются отрицательными , и если не опорожнить. Затемsed
удаляет все пробелы после a,-
а затем заменяет несколько последовательных пробелов на один. Обратите внимание, что это означает, что выравнивание будет нарушено, поскольку в некоторых полях будет два или более символов, а в других - один. Это не будет проблемой, если вы работаете с полями, они просто не выглядят красиво.источник
sed
Образом:Вывод:
Первое выражение убивает завершающий столбец, если существует нечетное количество столбцов. Это делается путем поиска 0 или более пар
<number> <number>
, где первое число может быть отрицательным.Изменить: более короткое
sed
решение, вдохновленное @mikeserv:То же самое с
perl
:Другой способ
perl
(вероятно, самый чистый):источник
Один
perl
:-an
разделить ввод на@F
массивBEGIN{$,=" "}
установить разделитель поля вывода на пробелgrep{!($_%2)}0..$#F
получить все четные индексы в@F
массиве, которые являются индексами нечетных элементовmap{$_=$F[$_]=~/^-/?"-$F[$_+1]":" $F[$_+1]"}
проверить, начинается ли нечетный элемент с-
, затем добавить-
следующий четный элемент, иначе добавить пробелисточник
Как ответ @ terdon, но без седа:
источник
python
решениеисточник
Простое математическое
awk
решение:i=2
) к последнему полю (i<=NF
).$(i-1)
) на -1 или 1.printf "%4s"
) и напечатайте завершающий перевод строки (print ""
).Единственное предостережение: если у вас нечетное количество столбцов, последнее поле вообще ничего не отобразит. Я надеюсь, что это то, что вы ожидаете.Видимо, это то, что вы ожидаете. :)(отредактировано для работы с десятичными значениями и для выравнивания условий цикла с вопросом при сохранении 2 символов.)
источник
Вы должны полностью забыть негатив - оставьте это. Вы хотите объединить два поля - слева направо. Это очень просто.
Обратите внимание, как я вообще избегаю любых ссылок на знак - при обработке ввода автомат будет принимать только пробелы или числа, потому что он больше ничего не понимает - все остальное полностью игнорируется и остается на месте.
Когда вы указываете
\{
числовой интервал повторения\}
для\(
подвыражения\)
,\1
обратная ссылка указывается только для последнего вхождения этого выражения . Таким образом, вы можете просто сжать - или обрезать - интервал повторения, который легко. И поскольку мы сжимаем повтор за знаком - если он есть - второе вхождение этого паттерна будет следовать за любым знаком, который раньше предшествовал первому.Описанное выше поведение определяется POSIX для всех BRE-совместимых приложений, но очень немногие
sed
понимают это правильно. GNUsed
делает.Наконец, пробелы просто для того, чтобы сделать шаблон регулярным .
Конечно, это никогда не сработает для вас. Или, возможно, более правильно, это всегда будет работать для вас, но никогда не даст никаких результатов. Как это может быть, если шаблон неопределен ?
источник