Substitua o número na primeira coluna por um comando de saída para cada linha no arquivo

1

Para cada primeiro número de coluna, quero substituir o número pelo resultado de ser processado por este script, bin.sh

#!/bin/bash

cd /tmp

rm bin.txt

echo "obase=2;$1" | bc > bin.txt

sleep 2

value='cat bin.txt'

sed -i 's/.*\(................\)//' bin.txt

sleep 2

echo "$((2#'cat bin.txt'))" 

Exemplo de execução manual para a linha superior:

root@vk4tux:/tmp# bin.sh 1023001
39961
root@vk4tux:/tmp# 

Portanto, 1023001 seria substituído por 39961 e assim por diante, para cada linha no arquivo tratada individualmente para substituir a saída de entrada bin.sh.

    
por Adrian Fewster 25.10.2018 / 08:27

1 resposta

2

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:

por 25.10.2018 / 09:18