command-line - ultima - linux bash contar lineas
Encontrar el número de líneas de un archivo de datos usando la línea de comando (2)
Esto no es posible de una manera directa. Puede redirigir el resultado del comando a un archivo, luego abrirlo y leerlo http://compgroups.net/comp.lang.fortran/how-to-get-the-output-of-call-system-in- av / 216294
O use algunas funciones aún más sofisticadas de las funciones de Unix y llame a su API C (vea la primera respuesta en ese hilo).
El EXECUTE_COMMAND_LINE () tampoco tiene ninguna característica para leer el resultado del comando directamente.
Existe una forma convencional de leer cada línea una a una y comprobar que el iostat
muestra un valor distinto de cero o negativo en cada lectura. Sin embargo, me gustaría llamar a la rutina del system(command)
y usar el comando wc -l
para contar el número y luego quiero asignar la dimensión de la matriz donde quiero poner los datos. Por ejemplo, estoy imprimiendo el número de líneas en ambos sentidos:
Program Test_reading_lines
integer:: count,ios, whatever
character(LEN=100):: command
Print*,''Reading number of lines in a standard way''
count=0
open (10, file=''DATA_FILE'')
Do
read (10,*,iostat=ios) whatever
if (ios/=0) exit
count=count+1
End Do
close(10)
Print*,''Number of lines ='', count
Print*,''Reading number of lines using shell command''
command=''cat DATA_FILE | wc -l''
call system(command)
Print*,''Number of lines ='',''< ? >''
End Program Test_reading_lines
Desafortunadamente, en este último caso, ¿puedo asignar una variable como count
como en el caso estándar? Es decir, quiero imprimir una variable en lugar de ''< ? >''
''< ? >''
en el último comando de impresión.
Si desea utilizar el comando de Unix $ wc -l
, puede llamar a la subrutina de Fortran execute_command_line
que es común a muchos compiladores de Fortran, incluidos los de gfortran
.
Aquí hay un ejemplo de trabajo que calcula el número de líneas, líneas, de un archivo llamado style.gnuplot
y luego utiliza nlines
para agregar algunas filas a style.gnuplot
sobrescribiendo el último.
PROGRAM numLines
IMPLICIT NONE
integer, parameter :: n = 100
integer :: i, nLines
real, parameter :: x0 = -3.14, xEnd = 3.14
real :: dx
real, dimension (:), allocatable :: x, fun
allocate(x(0:n)) ! Allocate the x array
allocate(fun(0:n)) ! Allocate the fun array
dx = abs(xEnd-x0)/n
x(0:n) = [(x0+i*dx, i = 0,n)] ! Create the x array
fun(0:n) = [(sin(x0+i*dx), i = 0,n)] ! Create the fun array
open(unit=1,file="plotFunction.dat")
DO i=0,size(x)-1
write(1,*) x(i), '' '', fun(i) ! Save the function to a file to plot
END DO
close(unit=1)
deallocate(x) ! Deallocate the x array
deallocate(fun) ! Deallocate the fun array
open(unit=7, file="style.gnuplot")
write(7,*) "set title ''y = sin(x)'' font ''times, 24''"
write(7,*) "set tics font ''times, 20''"
write(7,*) "set key font ''times,20''"
write(7,*) "set grid"
write(7,*) "set key spacing 1.5"
write(7,*) "plot ''<cat'' u 1:2 w l lw 2 linecolor rgb ''orange'' notitle "
close(unit=7)
CALL execute_command_line("wc -l style.gnuplot | cut -f1 -d'' '' > nlines.file") ! COunt the lines
open(unit=1,file=''nlines.file'')
read(1,*) nlines ! Here the number of lines is saved to a variable
close(unit=1)
CALL execute_command_line("rm nlines.file") ! Remove nlines.file
CALL execute_command_line("cat plotFunction.dat | gnuplot -p style.gnuplot") ! Show the plot within the executable
open(unit=7,file="style.gnuplot")
DO i = 1,nLines-1
read(7,*) ! Read the file untile the penultimate row,
END DO ! then append the other rows
write(7,*) "set object rectangle at -3.14,0 size char 1, char 1", &
" fillcolor rgb ''blue'' fillstyle solid border lt 2 lw 1.5"
write(7,*) "set object rectangle at 0,0 size char 1, char 1", &
" fillcolor rgb ''blue'' fillstyle solid border lt 2 lw 1.5"
write(7,*) "set object rectangle at 3.14,0 size char 1, char 1", &
" fillcolor rgb ''blue'' fillstyle solid border lt 2 lw 1.5"
write(7,*) "plot ''plotFunction.dat'' u 1:2 w l lw 2 linecolor rgb ''orange'' notitle"
close(unit=7)
CALL execute_command_line("gnuplot -p ''style.gnuplot''") ! Load again style.gnulot with the appended lines
END PROGRAM numLines
Mi código podría no ser elegante, ¡pero parece funcionar!