ファイルの各行の最初の列の数字をコマンド出力に置き換えます。

ファイルの各行の最初の列の数字をコマンド出力に置き換えます。

各最初の列番号について、このスクリプトで処理した結果に番号を変更したいと思います。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直接台本を書くことができます。

関連:

おすすめ記事