Bash 如何从文本文件中一次提取100个数字?

Bash 如何从文本文件中一次提取100个数字?,bash,Bash,我对bash脚本非常陌生,但我需要用它执行一些任务。我有一个只有一列数字(6250000)的文件。我需要一次提取100个,将它们放入一个新文件中,并将每个100个提交给另一个程序。我认为这应该是某种循环,每100个数字通过我的文件,然后提交给程序 假设我在文件中的数字是这样的 1.6435 -1.2903 1.1782 -0.7192 -0.4098 -1.7354 -0.4194 0.2427 0.2852 我需要将这62500个输出文件中的每一个都提供给一个有参数文件的程序。我是这样做

我对bash脚本非常陌生,但我需要用它执行一些任务。我有一个只有一列数字(6250000)的文件。我需要一次提取100个,将它们放入一个新文件中,并将每个100个提交给另一个程序。我认为这应该是某种循环,每100个数字通过我的文件,然后提交给程序

假设我在文件中的数字是这样的

1.6435
-1.2903
1.1782
-0.7192
-0.4098
-1.7354
-0.4194
 0.2427
 0.2852

我需要将这62500个输出文件中的每一个都提供给一个有参数文件的程序。我是这样做的:

lossopt()
{
cat<<END>temp.par
Parameters for LOSSOPT
***********************

START OF PARAMETERS:
lossin.out                            \Input file with distribution
1                                       \column number
lossopt.out                             \Output file
-3.0 3.0   0.01                      \xmin, xmax, xinc
-3.0 1
0.0 0.0
0.0 0.0
3.0 0.12

END
}
for i in {1..62500}
do
sed -n 1,100p ./rearnum.out > ./lossin.out
echo temp.par | ./lossopt >> lossopt.out
rm lossin.out
cut -d " " -f 101- rearnum.out > rearnum.out
done
lossopt()
{
猫/丢失
回声温度
rm lossin.out
剪切-d”“-f 101-rearnum.out>rearnum.out
完成

rearnum是我的大初始文件

如果需要将其拆分为每个包含100行的文件,我会使用
split-l100
,它将创建许多名为
xaa
xab
xac
,…每个文件最多包含100行源文件(最后一个文件包含的行可能更少)。如果希望名称以非
x
开头,则可以提供前缀,这些名称应作为
split
的最后一个参数,如
split-l 100 OUT
中的前缀,该前缀现在将提供类似
OUTaa
OUTab

然后,您可以循环这些文件,并以您喜欢的方式处理它们

for file in OUT*; do
    <other_script> "$file"
done
用于文件输入输出*;do
“$file”
完成

如果需要将其拆分为每个包含100行的文件,我会使用
拆分-l 100
,它将创建许多名为
xaa
xab
xac
,…每个文件最多包含100行源文件(最后一个文件包含的行可能更少)。如果希望名称以非
x
开头,则可以提供前缀,这些名称应作为
split
的最后一个参数,如
split-l 100 OUT
中的前缀,该前缀现在将提供类似
OUTaa
OUTab

然后,您可以循环这些文件,并以您喜欢的方式处理它们

for file in OUT*; do
    <other_script> "$file"
done
用于文件输入输出*;do
“$file”
完成

您仍然可以使用
读取
循环和重定向:

#!/bin/bash

fnbase=${1:-file}
increment=${2:-100}

declare -i count=0
declare -i fcount=1

fname="$(printf "%s_%08d" "$fnbase" $((fcount)))"

while read -r line; do
    ((count == 0)) && :> "$fname"
    ((count++))
    echo "$line" >> "$fname"
    ((count % increment == 0)) && {
        count=0
        ((fcount++))
        fname="$(printf "%s_%08d" "$fnbase" $((fcount)))"
    }
done

exit 0
使用/输出

$ bash script.sh yourprefix <yourfile

它将为每个文件写入20行到
yourprefix\uu0000000 1
->
yourprefix\u9999

您仍然可以使用
读取
循环和重定向:

#!/bin/bash

fnbase=${1:-file}
increment=${2:-100}

declare -i count=0
declare -i fcount=1

fname="$(printf "%s_%08d" "$fnbase" $((fcount)))"

while read -r line; do
    ((count == 0)) && :> "$fname"
    ((count++))
    echo "$line" >> "$fname"
    ((count % increment == 0)) && {
        count=0
        ((fcount++))
        fname="$(printf "%s_%08d" "$fnbase" $((fcount)))"
    }
done

exit 0
使用/输出

$ bash script.sh yourprefix <yourfile

它将在每个文件中写入20行到
yourprefix\uu00000001
->
yourprefix\u99999

即使在bash中这对专业人士来说似乎很愚蠢,我也会冒这个险,发布我自己的问题答案

cat<<END>temp.par
Parameters for LOSSOPT
                  ***********************

START OF PARAMETERS:
lossin.out                            \Input file with distribution
1                                       \column number
lossopt.out                             \Output file
-3.0 3.0   0.01                      \xmin, xmax, xinc
-3.0 1
0.0 0.0
0.0 0.0
3.0 0.12

END
for i in {1..62500}
do
sed -n 1,100p ./rearnum.out >> ./lossin.out
echo temp.par | ./lossopt >> sdis.out
rm lossin.out
tail -n +101 rearnum.out > temp
tail -n +1 temp > rearnum.out
rm temp 
done
cat>/lossin.out
回声温度PAR.V/LoSopP>
rm lossin.out
尾部-n+101后部数量输出>温度
尾部-n+1温度>后部数量输出
室温
完成

这个脚本必然会“吃掉”大的初始文件并放入“片段”进入外部程序。在它获取了100个数字中的一部分后,它会从大文件中删除这一部分。然后,这个过程会重复,直到大文件为空。这不是一个优雅的解决方案,但对我来说是有效的。

即使在bash中,对于专业人士来说这可能看起来很愚蠢,我也会冒这个风险,发布我自己的问题答案

cat<<END>temp.par
Parameters for LOSSOPT
                  ***********************

START OF PARAMETERS:
lossin.out                            \Input file with distribution
1                                       \column number
lossopt.out                             \Output file
-3.0 3.0   0.01                      \xmin, xmax, xinc
-3.0 1
0.0 0.0
0.0 0.0
3.0 0.12

END
for i in {1..62500}
do
sed -n 1,100p ./rearnum.out >> ./lossin.out
echo temp.par | ./lossopt >> sdis.out
rm lossin.out
tail -n +101 rearnum.out > temp
tail -n +1 temp > rearnum.out
rm temp 
done
cat>/lossin.out
回声温度PAR.V/LoSopP>
rm lossin.out
尾部-n+101后部数量输出>温度
尾部-n+1温度>后部数量输出
室温
完成

这个脚本必然会“吃掉”大的初始文件并放入“片段”进入外部程序。在它取下100号中的一部分后,它会从大文件中删除这一部分。然后,这个过程会重复,直到大文件为空。这不是一个优雅的解决方案,但它对我有效。

哦,我完全相反地阅读了它。我以为他想从他的大文件中取出每100行,并将其写入一个新文件然后发送到他的程序。ThanksOh,我完全相反地阅读了它。我以为他想从他的mega文件中取出每100行,并将其写入一个新文件,然后发送到他的程序。Thanksh我需要将这62500个输出文件中的每一个都提供给一个有参数文件的程序。我正在这样做:lossopt(){ CAT//LoSim.OUT TEMPOR PAR.V./LoSopopt>-f 101-rearnum.out>rearnum.out done我恐怕不太清楚你想要输出文件是什么样子。你想让它们都有你在那里的
cat
header,后面跟着100行数据,然后通过管道将其传递给
/lossopt
?如果是的话,我所做的可以很容易地使用。就在fo中r loop do
lossopt;cat$file
并让您的函数只打印到stdout而不是写入文件。当然,您可能不需要我的方法创建的所有临时文件,尽管您可以在每次迭代中删除
$file
,但我需要将这些62500个输出文件中的每一个都提供给具有参数文件的程序像这样的东西:LoSopopter({)猫/。-f 101-rearnum.out>rearnum.out done我恐怕不太清楚你想要输出文件是什么样子。你想让它们都有你在那里的
cat
header,后面跟着100行数据,然后通过管道将其传递给
/lossopt
?如果是的话,我所做的可以很容易地使用。就在fo中r loop do
lossopt;cat$file
并让您的函数只打印到stdout而不是编写文件。当然,您可能不想要/需要我的方法创建的所有临时文件,但您可以在每次迭代中删除
$file
,如果您不熟悉bash脚本,但需要使用它执行一些任务,也许可以在收入