我是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是我最初的大文件
答案 0 :(得分:5)
如果您需要将其拆分为每个包含100行的文件,我会使用split -l 100 <source>
来创建大量名为xaa
,xab
,{{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号码的一部分后,它会从大文件中删除该部分。然后,重复该过程直到大文件为空。它不是一个优雅的解决方案,但它对我有用。