Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash 文件操作循环_Bash_Unix_Loops_Awk - Fatal编程技术网

Bash 文件操作循环

Bash 文件操作循环,bash,unix,loops,awk,Bash,Unix,Loops,Awk,好的,这个问题有两个方面:1)实际的文件操作位2)在unix中循环此操作 第1部分) 我有两个文件: 文件1 a b c d e f g h 和文件2 A B C D E F G H I J 我希望(首先)得到以下结果: a b A B > c d A B > e f A B > g h A B …并将此输出保存到outfile1 我想我必须使用awk、剪切和/或粘贴之类的东西,但我无法将它们全部放在一起 第2部分) 然后,我想对文件_2中的所有行循环此操作(请注意,文件

好的,这个问题有两个方面:1)实际的文件操作位2)在unix中循环此操作

第1部分)

我有两个文件:

文件1

a b
c d
e f
g h
和文件2

A B
C D
E F
G H
I J
我希望(首先)得到以下结果:

a b
A B
>
c d
A B
>
e f
A B
>
g h
A B
…并将此输出保存到outfile1

我想我必须使用awk、剪切和/或粘贴之类的东西,但我无法将它们全部放在一起

第2部分)

然后,我想对文件_2中的所有行循环此操作(请注意,文件_1中的行数与文件_2中的行数不同),这样我将得到5个输出文件,其中outfile2将是:

a b
C D
>
c d
C D
>
e f
C D
>
g h
C D
a b
E F
>
c d
E F
>
e f
E F
>
g h
E F
排水管3应为:

a b
C D
>
c d
C D
>
e f
C D
>
g h
C D
a b
E F
>
c d
E F
>
e f
E F
>
g h
E F
等等

目前我在bash工作。提前感谢您的帮助

sort -m -f file1 file2 | uniq -i --all-repeated=separate
看起来很近。但是,在二读时,我认为您需要更像以下perl脚本的内容:

use strict;
use warnings;

open(my $FILE1, '<file1') or die;

my $output = 0;

while (my $a = <$FILE1>)
{
    $output++;
    open(my $OUT, ">output$output");
    open(my $FILE2, '<file2') or die;

    print $OUT "$a$_---\n" foreach (<$FILE2>);

    close $FILE2;
    close $OUT;
}

close $FILE1;
使用严格;
使用警告;
打开(my$FILE1,“以生成输出文件_3(带有EF),例如:

x=$(sed -n '3p' File_2)
awk "{ printf \"%s\\n%s\\n>\\n\", \$0, \"$x\" }" File_1 > outfile_3
在第一行
'3p'
中,切掉第三行
现在让我们以循环的方式进行:

(( i = 1 ))
while read line
do
  awk "{ printf \"%s\\n%s\\n>\\n\", \$0, \"$line\" }" File_1 > "outfile_$i"
  (( i++ ))
done < File_2
((i=1))
读行时
做
awk“{printf\%s\\n%s\\n>\\n\”,\$0,\“$line\”}”文件\u 1>“outfile\ui”
((i++)
完成<文件2
awk单衬板:

     awk 'NR==FNR{a[NR]=$0;l=NR;next;} {b[FNR]=$0;}
    END{f=1; for(x=1;x<=FNR;x++){for(i=1;i<=length(a);i++){
printf "%s\n%s\n%s\n", a[i],b[x],">" > "output"f }f++;}}' f1 f2
awk'NR==FNR{a[NR]=0;l=NR;next;}{b[FNR]=0;}
结束{f=1;对于(x=1;x“输出”f}f++;}}}'f1 f2
测试:

kent$head f1 f2
==>f1 f2输出1
c d
A B
>
EF
A B
>
GH
A B
>
==>输出2
c d
C D
>
EF
C D
>
GH
C D
>
==>输出3
c d
EF
>
EF
EF
>
GH
EF
>
==>输出4
c d
GH
>
EF
GH
>
GH
GH
>
==>输出5
c d
I J
>
EF
I J
>
GH
I J
>

这可以通过
bash
重定向来完成:

i=1
读f2时,做
读f1的时候,做什么
回显“$f1”
回显“$f2”
回声“>”
完成输出$i
((i++)
完成<文件2

head-n-1
避免在每个
output$i
文件的末尾有一个单独的分隔符。

我对Unix中的编码非常陌生,所以目前我能做的最复杂的事情是按照
awk NR==51{print$3,$4;exit}'
的思路进行,所以我的问题是(基本上)我如何使用UnixPLease处理输入文件以获取输出文件请提出您的问题。我想,如果您向OP解释它是如何工作的以及为什么工作的,您的解决方案会更好,特别是因为他是“Unix编码新手”。正如stakx所说,虽然我非常喜欢你的答案,但这对我来说真的很难解构。这也意味着当我遇到错误时(我会这样做):
awk:source line 2上下文的语法错误是END{f=1;for(x=1;x>>“output”对于标记为
bash
awk
的问题,基于Perl的解决方案?感谢您花时间回答我的问题,但正如stakx所暗示的,这对我来说不是很有用-我无法用Perl重新编写脚本。无需重写内容。我得到的印象是这是一个新脚本。您可以像awk一样从bash使用它:)比我的更干净,我简直无法想象bash中的嵌套循环)我同意这一点。注意性能问题。perl解决方案会快得多,但这只会在文件变大或磁盘变慢的情况下造成伤害:)事实上,此解决方案在大输入上表现不好。感谢您的回答-来自Matlab背景,这是我最直观的答案。谢谢!这正是我想要的至少我想要。