У меня есть файл в следующем формате:
$ cat /tmp/raw
2015-01 5000 1000
2015-02 6000 2000
2015-03 7000 3000
Теперь я хочу получить объединенное значение из столбцов 2 и 3 в каждой строке, чтобы получить следующие результаты:
2015-01 6000
2015-02 8000
2015-03 9000
Я пробовал это, но он показывает только последнее значение в файле, как значение 2015-03.
text-processing
Сайед Джаханзаиб
источник
источник
Вот несколько способов:
Еще один подход awk
Perl
или
Оболочка (намного медленнее / менее эффективна, чем указано выше)
источник
$2+=$3
может быть более ненадежнымawk '{$2+=$3}NF--'
чтобы не осталось пустого поля 3. Хотя это только мое предпочтение, и оно слишком похоже на пост в качестве ответа само по себе :)sed
каким-то образом удается понять поля - даже определять поля на лету, а также поля с полями - но, как, очевидно, и происходит, вся концепция сопоставления регулярных выражений Unix фактически основана на разделении строки на поля согласно шаблону ! Кто знал?... печать ...
Итак, выше я объявляю регулярное выражение, которое определяет экстент поля , состоящий из одной последовательности символов
*
переменной длины, которые^
не являются <пробелом>, за которыми сразу же следует одна последовательность символов*
переменной длины, которые являются <пробелом> . Это объявление применяется кsed
пространству паттернов России, которое представляет собой строку, разделенную (по умолчанию) каждым\n
символом ewline, которая встречается на входе, и которая рекурсивно заменяется (по умолчанию) на следующий для каждого вхождения того же самого.Интерфейс для этой декларации двоякий, и на каждом уровне он полностью регулируется и определяется по крайней мере одним международным официальным комитетом стандартов IEEE для обеспечения предсказуемого применения
sed
командного синтаксиса.sed
Синтаксис API , например, в этом случае применяется с помощью команды/
address (которая всегда является первым компонентом любой команды ubstitution) , но его содержимое интерпретируется более базовым API как подмножество, указанное для функция в стандартной библиотеке C ./
sed s///
regcomp()
Я могу сделать эти заявления уверенно, потому что
sed
это не просто программа, а, скорее, скомпилированный исполняемый файл, названныйsed
на моей Unix-подобной машине, является реализацией четко определенного, исторически сложившегося и управляемого стандартамиsed
приложения моей системы. библиотеки соответствия выражений.Из
sed
спецификации:... где мы находим ...
Приложение, которое вызывает
regcomp()
, представит ему строку шаблона и ...Чтобы действовать в этом направлении, указанное приложение будет ссылаться на
regcomp()
сопутствующую функцию ...И так, когда я делаю ...
...
sed
сначала компилирует регулярное выражение и сохраняет результаты в памяти, а затем применяет скомпилированный автомат, хранящийся там, к содержимому моего пространства шаблонов столько раз, сколько необходимо для выполнения моей команды. Каждый раз, когда это происходит, результатом является массив из одного или более полей с нулевым разделением, которые разграничиваются смещениями, возвращаемымиregexec()
.И когда я делаю ...
... чтобы указать, что следует использовать последнее определенное регулярное выражение,
sed
можно простоregexec()
снова вызвать повторно скомпилированное регулярное выражение, но, возможно, применить его на этот раз к измененному строковому аргументу или применить новые параметры nmatch в качестве команды I.Точнее еще ...
s/[^ ]* */[&]P/
[
левую квадратную скобку, затем на&
себя, затем на]
правую квадратную скобку, за которой следуетP
символ.s//&+pc/3
3
третье вхождение шаблона в пространстве шаблона на&
себя, за которым следует добавленная строка+pc
.И поэтому для каждой строки
sed
ввода он записывает в свой стандартный вывод, учитывая данные вашего примера:Это может показаться странным, но
dc
калькулятор заключает в кавычки строки в своих входных данных в квадратных скобках, иP
команда будет печатать верхнюю часть стека без добавления\n
ewline, а затем выталкивать его из стека ввода.И так, используя первую строку там в качестве примера,
dc
сделаем:[2015-01 ]P
P
набросать и вытолкнуть вершину стека5000
5000
в верхнюю часть стека и сдвиньте все элементы, находящиеся в данный момент в стеке (теперь их нет) , на единицу.1000
+
6000
.[
строкой]
.p
p
Отпечатайте вершину стека, а затем добавленную\n
ewline, не выталкивая ее из стека.c
c
учить стекисточник