在shell中的两列中写两个循环输出?

时间:2016-04-20 01:56:13

标签: shell awk

如何以有效的方式撰写以下内容:

for j in {1..339};do
  for i in {1..427};do
    echo -e $j'\t'$i  >> ofile.txt
  done
done

8 个答案:

答案 0 :(得分:3)

这里有一个没有显式循环的替代方案

public void onPause() {
  super.onPause();
  tickHandler.removeCallbacksAndMessages(null);
}

答案 1 :(得分:2)

将重定向移动到外部循环,因此ofile.txt仅打开一次。

for j in {1..339}; do
  for i in {1..427}; do
    echo -e "$j\t$i"
  done
done >> ofile.txt

使用C风格的循环来防止那些花括号必须扩展可能更好,尽管我还没有对它进行分析。这是一种较少的优化。

for ((j = 1; j <= 339; ++j)); do
  for ((i = 1; i <= 427; ++i)); do
    echo -e "$j\t$i"
  done
done >> ofile.txt

答案 2 :(得分:2)

Karakfa 的方法,没有 cut

join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt

基准测试,使用 bash 的内置时间命令,只是'真实'号码(在系统与系统之间有所不同,我的CPU约为4390 bogomips) :

  • 加入 Karakfa-agc ):。029s
  • 加入剪切 Karakfa ):。039s
  • 我的Szilágyi):。086s
  • perl Osmanov ):。092s
  • awk Morton ):。133s
  • 破折号 agc ):1.159s
  • bash Kugelman ):2.153s
  • bash Kayan - OP):3.001s

外卖:加入提供100倍的加速。

答案 3 :(得分:2)

cat my.c

#include <stdio.h>
#include <stdlib.h>

main(n,s)int n; char **s;{
int i, j;
if(n!=3)exit(1);
for(i=1; i<=atoi(s[1]); i++)
  for(j=1; j<=atoi(s[2]); j++)
    printf("%4d %4d\n",i,j);
}

gcc my.c -o my

time ./my 339 427 >ofile.txt
real    0m0.035s
user    0m0.024s
sys 0m0.008s

cat karakfa_agc_solution
join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt

time ./karakfa_agc_solution >ofile.txt
real    0m0.032s
user    0m0.012s
sys 0m0.008s

cat /proc/cpuinfo |grep bogo
bogomips    : 6629.54

我也无法用C语言做更快的代码。

答案 4 :(得分:1)

perl -e '
for my $j (1..339) {
  for my $i (1..427) {
    print "$j\t$i\n";
  }
}
' > ofile.txt

答案 5 :(得分:1)

awk 'BEGIN {
    OFS="\t"
    for (j=1;j<=339;j++) {
      for (i=1;i<=427;i++) {
        print j, i
      }
    }
}' > ofile.txt

另见https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

答案 6 :(得分:1)

POSIX shell, seq

#!/bin/dash
for j in `seq 339`;do
  for i in `seq 427`;do
    echo $j\\\t$i
  done
done > ofile.txt

答案 7 :(得分:1)

使用fwrite()函数和ASCII代码表(参考@agc)可以快一点C代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define L 6                   // max digit

main(n,s)int n; char **s;{
unsigned int i, j, k, m1, m2, mx;
char *p;

if(n!=3){printf("Usage %s num1 num2\n", s[0]); exit(__LINE__);}
m1=atoi(s[1]); m2=atoi(s[2]);
if(!(m1*m2)|| strlen(s[1])>L|| strlen(s[2])>L)exit(__LINE__);

mx=m1>m2?m1:m2;              // max input num

// allocate and init ASCII code tbl for the bigest inp oper
if(!(p=(char *)malloc((mx+1)*(L+2))))exit(__LINE__);
if(!memset(p, ' ', (mx+1)*(L+2)))exit(__LINE__);
for(i=1; i<=mx; i++){
   for(j=i,k=L-1; j; j/=10,k--)p[i*(L+2)+k]=j%10+'0';
   p[i*(L+2)+L]='\t'; p[i*(L+2)+L+1]='\n';}

for(i=1; i<=m1; i++)         //print variants from ASCII tbl
  for(j=1; j<=m2; j++){
    fwrite(p+(L+2)*i, L+1, 1,stdout);
    fwrite(p+(L+2)*j, L+2, 1,stdout);}
}

gcc -o optf optf.c

time ./optf 339 427 >ofile.txt
real    0m0.010s
user    0m0.004s
sys 0m0.004s
bogomips    :6629
architecture:AMD Phenom(tm) II X2 560