С помощью команды GNUdatamash
:
$ datamash -t'|' -s -g 1,2,3,4,5,6 sum 7 < infile
11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|8409
Вdatamash v1.2+
вы также можете указать диапазон столбцов.
$ datamash -t'|' -s -g 1-6 sum 7 < infile
Или самая короткаяAWK
альтернатива, и где у вас было N столбцов, и вы не должны указывать все один за другим:
awk -F'|' '{x=$NF;NF--; a[$0]+=x} END{for(i in a) print i, a[i]}' OFS='|' infile
Я сделал следующий программный файлprog.f
program test
character IN*30,OUT*30,line*80
PRINT *,'Input file '
READ(*,'(A)') IN
OPEN(1,FILE=IN,STATUS='OLD')
PRINT *,'Output file?'
READ(*,'(A)') OUT
OPEN(2,FILE=OUT,STATUS='NEW',BLANK='ZERO')
read (1,'(a80)') line
write (2,*) "I read ", line
end
скомпилировал и связал его с
gfortran prog.f -o prog
Я поместил текстовую строку во входной файл
echo "Hello World" > in
Затем я отправил имена входного файла in
и выходного файла out
в программу
$ <<< 'in
out'./prog
Input file
Output file?
и проверил выходной файл
$ cat out
I read Hello World
<<<
работает в bash
. Вы можете предпочесть трубопровод из echo
, который является более портативным,
$ rm out
rm: remove normal file 'out'? y
$ echo 'in
out' |./prog
Input file
Output file?
$ cat out
I read Hello World
Если повезет, то может
<infile./program >outfile
будет работать. Перенаправление для предоставления файлового дескриптора. Варианты/аргументы???
Пока мы, земляне, пишем что-то типа...
$ <77in cat >77.out
$ cat 77in >77.out
(Это копирует только 77in
в77.out
)
...этой программе/команде Fortran77 нужны были операнды построчно в одном входном файле/потоке:
$ <77.io cat
77in
77.out
Теперь, если бы cat
было чем-то другим, первая строка была бы проанализирована как входной файл (, содержащий «hello\nworld», например. )и второй как файл для создания.
И это кажется более новым, простым способом...
Вместо длинного списка аргументов вроде cp -a dir1 dir2 dest
это <in_list cpa77
.
Но тогда нужен дополнительный файл... как и в современных cpio
:
<filelist cpio -o >files.cpio
. Конечно, cpio
просто нужен STDIN построчно:
find. | cpio -o >files.cpio
(cpio
имеет этот специальный синтаксис вызова из-за его функционирования, работающего со многими файлами. Это одна с половиной команда . То же для tar
, по-другому)
Если что-то и типично для Unix, так это гибкость в передаче управления и данных командам в оболочке. Как я прокомментировал :хороший Q в конце концов! (Спасибо за принятый ответ!)