com awk
:
$ awk '{ $1 -= lshift(rshift($1,16),16); print }' <file
39961 VE3THW Wayne
39962 VA3ECM Mathieu
39963 VE3QC Guy
39964 VE3LDY Louella
39965 VE3JFN Jeffrey
39966 VA3UZ Allan
39967 VA3BOC Hans
39968 VE3JMR
39969 VA3AMO Rolando
39970 VA3AMO Rolando
39973 VE3SLD Barry
39974 VA3DB Diane
39975 VE3FVD Friedrich
39976 VE3IAO John
39977 VA3MSV John
39978 VA3BTQ Jacqualine
39979 VA3BTQ Jacqualine
39980 VE3ZXN Denis
39981 VE3ZXN Denis
39982 VE3EM Don
39983 VA3TDG Douglas
39984 VA3MRJ David
39985 VA3ZDX Gregory
Isso remove tudo, menos os 16 bits inferiores de informação na primeira coluna dos dados de entrada, que é o que seu script parece estar fazendo.
Para reproduzir com mais fidelidade o formato tabular dos dados de entrada, canalize o resultado por meio de column -t
.
Usando um loop de shell:
while read -r num stuff; do
printf '%d %s\n' "$(( num - (( num >> 16 ) << 16) ))" "$stuff"
done <file
Se você quiser o atraso de quatro segundos na impressão de cada linha, insira as chamadas sleep
apropriadas no loop do shell ou chame system("sleep N")
no código awk
, em que N
é um número positivo.
Para usar seu script original:
while read -r num stuff; do
printf '%d %s\n' "$( ./bin.sh "$num" )" "$stuff"
done <file
Isto é, chame o script em uma substituição de comando com o número lido em seu arquivo. Note, no entanto, que isso seria muito ineficiente em arquivos grandes, pois seu script chama vários utilitários externos para fazer seu cálculo e, além disso, impede incondicionalmente um arquivo ( /tmp/bin.txt
) e o deixa para trás. Eu provavelmente iria com o script awk
eu mesmo.
Relacionados: