将文件中每一行的第一列中的数字替换为命令输出

将文件中每一行的第一列中的数字替换为命令输出

对于每个第一列编号,我想用此脚本处理的结果替换该数字,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

使用 shell 循环:

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

如果您希望打印每一行有四秒的延迟,请sleep在 shell 循环中插入适当的调用或在代码system("sleep N")中调用awk,其中N是某个正数。

要使用您的原始脚本:

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

也就是说,使用从文件中读取的数字在命令替换中调用脚本。但请注意,这对于大文件来说效率非常低,因为您的脚本调用多个外部实用程序来进行计算,并且它还会无条件地破坏文件 ( /tmp/bin.txt) 并将其留在后面。我可能会自己去awk写剧本。

有关的:

相关内容