首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换第一列中的数字,而不对文件中的每一行执行命令

问替换第一列中的数字,而不对文件中的每一行执行命令
EN

Unix & Linux用户
提问于 2018-10-25 06:27:00
回答 1查看 76关注 0票数 1

对于第一个列号,我希望用此脚本处理的结果替换该编号,bin.sh

代码语言:javascript
复制
#!/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`))" 

顶部行的示例手动运行:

代码语言:javascript
复制
root@vk4tux:/tmp# bin.sh 1023001
39961
root@vk4tux:/tmp# 

因此,对于文件中的每一行单独处理到bin.sh输入输出替换,1023001将被替换为39961等等。

EN

回答 1

Unix & Linux用户

发布于 2018-10-25 07:18:04

使用awk:

代码语言:javascript
复制
$ awk '{ $1 -= lshift(rshift($1,16),16); print }' 

这将删除输入数据第一列中的低16位信息以外的所有内容,这是脚本似乎要做的事情。

若要更忠实地再现输入数据的表格格式,请通过column -t传递结果。

使用shell循环:

代码语言:javascript
复制
while read -r num stuff; do
    printf '%d %s\n' "$(( num - (( num >> 16 ) << 16) ))"  "$stuff"
done 

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

使用原始脚本:

代码语言:javascript
复制
while read -r num stuff; do
    printf '%d %s\n' "$( ./bin.sh "$num" )"  "$stuff"
done 

也就是说,用从文件中读取的数字调用命令替换中的脚本。但是请注意,在大型文件上,这将是非常低效的,因为脚本调用了几个外部实用程序来进行计算,此外,它还无条件地破坏了一个文件(/tmp/bin.txt),并将其抛在后面。我可能会亲自使用awk脚本。

相关信息:

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/477676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档