파일의 각 줄 첫 번째 열에 있는 숫자를 명령 출력으로 바꿉니다.

파일의 각 줄 첫 번째 열에 있는 숫자를 명령 출력으로 바꿉니다.

각 첫 번째 열 번호에 대해 이 스크립트에서 처리한 결과로 번호를 바꾸고 싶습니다.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/.*\(................\)/\1/' bin.txt

sleep 2

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

최상위 수동 실행 예:

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

따라서 파일의 각 행에 대해 1023001은 39961로 대체되며, 계속해서 bin.sh 입력 및 출력 대체를 별도로 처리합니다.

답변1

그리고 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

이렇게 하면 입력 데이터의 첫 번째 열에 있는 하위 16비트 정보를 제외한 모든 정보가 제거됩니다. 이는 스크립트가 수행하는 것으로 보입니다.

입력 데이터의 표 형식을 보다 충실하게 재현하려면 결과를 파이프하십시오 column -t.

쉘 루프를 사용하십시오:

while read -r num stuff; do
    printf '%d %s\n' "$(( num - (( num >> 16 ) << 16) ))"  "$stuff"
done <file

4초 지연으로 각 줄을 인쇄하려면 sleep셸 루프에 적절한 호출을 삽입하거나 양수가 있는 코드 를 system("sleep N")호출하세요 .awkN

원본 스크립트를 사용하려면:

while read -r num stuff; do
    printf '%d %s\n' "$( ./bin.sh "$num" )"  "$stuff"
done <file

즉, 파일에서 읽은 숫자를 사용하여 명령 대체에서 스크립트가 호출됩니다. 그러나 스크립트가 여러 외부 유틸리티를 호출하여 계산을 수행하고 무조건 파일( /tmp/bin.txt)을 삭제하고 남겨두기 때문에 이는 대용량 파일의 경우 매우 비효율적입니다. 내가 awk직접 대본을 쓸 수도 있다 .

관련된:

관련 정보