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

时间:2015-05-19 02:13:10

标签: 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输出文件中的每一个都输入到具有参数文件的程序中。我正在做这样的事情:

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

rearnum是我最初的大文件

3 个答案:

答案 0 :(得分:5)

如果您需要将其拆分为每个包含100行的文件,我会使用split -l 100 <source>来创建大量名为xaaxab,{{1}的文件},...每个源文件最多包含100行(最后一个文件可能包含较少的行)。如果您希望名称以xac以外的名称开头,则可以将这些名称作为x的最后一个参数用作split中的前缀,现在将提供split -l 100 <source> OUT等文件1}},OUTaa,...

然后你可以循环遍历那些文件并随意处理它们。如果您需要使用它们运行脚本,您可以执行类似

的操作
OUTab

答案 1 :(得分:0)

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

#!/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

这将使yourfile包含数千行并将每100行写入yourprefix_00000001 - &gt; yourprefix_99999999(默认为file_000000001等。)。在开始写作之前,每个新文件名都被截断为0行。

同样,您可以在命令行上指定要写入每个文件的行数。 E.g:

$ bash script.sh yourprefix 20 <yourfile

每个文件会将20行写入yourprefix_00000001 - &gt; yourprefix_99999999

答案 2 :(得分:0)

尽管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

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