Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何使用AWK/SED实现这一点:定期插入行,然后为每N行预先插入其余行_Loops_Sed_Awk_Insert_Append - Fatal编程技术网

Loops 如何使用AWK/SED实现这一点:定期插入行,然后为每N行预先插入其余行

Loops 如何使用AWK/SED实现这一点:定期插入行,然后为每N行预先插入其余行,loops,sed,awk,insert,append,Loops,Sed,Awk,Insert,Append,如何使用AWK/SED实现这一点。我厌倦了数组,但显然在ksh数组中删除一个范围并不是那么容易 输入文件如下 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 mkdir dir_1 mv f1 dir_1 mv f2 dir_1 mv f3 dir_1 echo "command -o option tralla.lalla /path/dir_1" >> logfile mkdir dir_2 mv f3 dir_2

如何使用AWK/SED实现这一点。我厌倦了数组,但显然在ksh数组中删除一个范围并不是那么容易 输入文件如下

f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
   mkdir dir_1
   mv f1 dir_1
   mv f2 dir_1
   mv f3 dir_1
   echo "command -o option tralla.lalla /path/dir_1" >> logfile  
   mkdir dir_2
   mv f3 dir_2
   mv f4 dir_2
   mv f6 dir_2
   echo "command -o option tralla.lalla /path/dir_2" >> logfile  
   mkdir dir_3
   mv f7 dir_3
   mv f8 dir_3
   mv f9 dir_3
   echo "command -o option tralla.lalla /path/dir_3" >> logfile  

   mkdir dir_4
   mv f10 dir_4

   #since there are only 10 files.dir_4 takes in whatever remains off that list 
   echo "command -o option tralla.lalla /path/dir_4" >> logfile  
我需要从文件的开头开始,循环N次。让N保持为3。所以在每3个文件之后创建一个目录

f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
   mkdir dir_1
   mv f1 dir_1
   mv f2 dir_1
   mv f3 dir_1
   echo "command -o option tralla.lalla /path/dir_1" >> logfile  
   mkdir dir_2
   mv f3 dir_2
   mv f4 dir_2
   mv f6 dir_2
   echo "command -o option tralla.lalla /path/dir_2" >> logfile  
   mkdir dir_3
   mv f7 dir_3
   mv f8 dir_3
   mv f9 dir_3
   echo "command -o option tralla.lalla /path/dir_3" >> logfile  

   mkdir dir_4
   mv f10 dir_4

   #since there are only 10 files.dir_4 takes in whatever remains off that list 
   echo "command -o option tralla.lalla /path/dir_4" >> logfile  
我尝试了数组,但结果完全不可靠

    th=$1
ar=('f1' 'f2' 'f3' 'f4' 'f5' 'f6')

for ((i=1; i<=$th; i++)); do

<stuff>
if [ "$i" -eq "$th" ]

then
# if its the last iteration of the loop.Whatever remains in the array - spit that out 
echo " `echo ${ar[*]}`"    >> somefile 

# it its anything short of the last iteration.Read N elements of the array at a time 
# and then delete them 
else
echo " `echo ${ar[*]:0:$N}`  " >> somefile 
     for ((x=0; x<=$N; x++)) ; do
     unset ar[$x]
     done

fi

像这样的东西可以使它:

awk 'NR%3 == 1 {print "mkdir dir_"++i}
     {print "mv", $1, "dir_"i}
     NR%3==0{print "command dir_"NR/3}
     END{print "echo \"command -o option tralla.lalla /path/dir_"i"\" >> logfile"}' file
如果
3
是可变的,您可以用
-v
填充它,如下所示:

awk -v n=3 'NR%n == 1 ...
            {print "mv", $1, "dir_"i}
            NR%n==0{print "command dir_"NR/n}
            END {} .... ' file
解释 基本上,它使用的是
NR
,表示记录数(本例中为行数)

  • NR%3==1
    表示行数为3k+1的行
  • NR%3==0
    表示行数为3k的行,即
    3
    的倍数
  • END{print“echo\”命令-o option tralla.lalla/path/dir\uu“i”\“>>日志文件”}
    使用
    command dir\ucode>+
    i
    打印挂起的行,这是
    mkdir
    上使用的最后一个值
它返回:

$ awk 'NR%3 == 1 {print "mkdir dir_"++i} {print "mv", $1, "dir_"i} NR%3==0{print "echo \"command -o option tralla.lalla /path/dir_"NR/3"\" >> logfile"} END{print "echo \"command -o option tralla.lalla /path/dir_"i"\" >> logfile"}' a
mkdir dir_1
mv f1 dir_1
mv f2 dir_1
mv f3 dir_1
echo "command -o option tralla.lalla /path/dir_1" >> logfile
mkdir dir_2
mv f4 dir_2
mv f5 dir_2
mv f6 dir_2
echo "command -o option tralla.lalla /path/dir_2" >> logfile
mkdir dir_3
mv f7 dir_3
mv f8 dir_3
mv f9 dir_3
echo "command -o option tralla.lalla /path/dir_3" >> logfile
mkdir dir_4
mv f10 dir_4
echo "command -o option tralla.lalla /path/dir_4" >> logfile
请注意,如果行数是3的倍数(或对于一般情况为
n
),则最后一行将写入两次。为此,
END
块可以改进为:

END{ if (NR%n) { print ...  }}

因此,如果
NR
不是
n

的倍数,在
mv f10 diru\u 3
之后,它将只打印
command diru 3
command diru\u 4
。是的,关于最后一个命令,你是对的。我编辑了命令,实际上命令本身包含目录名echo“command-o option tralla.lala/path/$directoryname”>log`从echo到log的所有内容。我怎么能做到这一点呢。再次感谢,命令本身包含目录名echo“command-o option tralla.lala/path/$directoryname”>log`从echo到log的所有内容。我怎么能得到这个——你是什么意思?试着正确解释,并用好的示例输入和可理解的输出更新您的问题。当然可以。我现在使用
echo”命令-o option tralla.lalla/path/dir_1“>>日志文件
,在minMmmm中这样做,你是什么意思?要打印或执行该代码?只需打印该行echo“command-option tralla.lalla/path/dir_1”>>日志文件,如上图所示。这将生成一个脚本。不要执行它。然后我将单独执行它。我会再次更新帖子