2

わかりました、この質問には 2 つの要素があります: 1) 実際のファイル操作ビット 2) UNIX でのこの操作のループ

パート1)

私は2つのファイルを持っています:

ファイル_1

a b
c d
e f
g h

および File_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)

次に、File_2 のすべての行に対してこの操作をループし (File_1 の行数は File_2 と同じではないことに注意してください)、最終的に 5 つの出力ファイルが作成されるようにします。ここで、outfile2 は次のようになります。

a b
C D
>
c d
C D
>
e f
C D
>
g h
C D

outfile3 は次のようになります。

a b
E F
>
c d
E F
>
e f
E F
>
g h
E F

現在、私はbashで作業しています。助けてくれてありがとう!

4

4 に答える 4

2

bashこれは、リダイレクトを使用して実行できます。

i=1

while read f2; do
  while read f1; do
    echo "$f1"
    echo "$f2"
    echo ">"
  done < File_1 | head -n -1 > output$i
  (( i++ ))
done < File_2

head -n -1output$i各ファイルの末尾に単独の区切り文字がないようにします。

于 2012-07-20T14:07:26.700 に答える
0
sort -m -f file1 file2 | uniq -i --all-repeated=separate

かなり近くに見えた。ただし、2回目の読み取りでは、次の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;

これにより、 file1の行と同じ数の出力ファイル、、、、が作成さoutput1れます。output12output3output...

于 2012-07-20T11:55:59.267 に答える
0

たとえば、outfile_3(EFを使用)を作成するには:

x=$(sed -n '3p' File_2)
awk "{ printf \"%s\\n%s\\n>\\n\", \$0, \"$x\" }" File_1 > outfile_3

最初の行で'3p'3 行目をカット
ループで実行してみましょう:

(( i = 1 ))
while read line
do
  awk "{ printf \"%s\\n%s\\n>\\n\", \$0, \"$line\" }" File_1 > "outfile_$i"
  (( i++ ))
done < File_2
于 2012-07-20T12:20:45.813 に答える
0

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

テスト:

kent$  head f1 f2
==> f1 <==
a b
c d
e f
g h

==> f2 <==
A B
C D
E F
G H
I J


kent$  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

kent$  head -30 out*
==> output1 <==
a b
A B
>
c d
A B
>
e f
A B
>
g h
A B
>

==> output2 <==
a b
C D
>
c d
C D
>
e f
C D
>
g h
C D
>

==> output3 <==
a b
E F
>
c d
E F
>
e f
E F
>
g h
E F
>

==> output4 <==
a b
G H
>
c d
G H
>
e f
G H
>
g h
G H
>

==> output5 <==
a b
I J
>
c d
I J
>
e f
I J
>
g h
I J
>
于 2012-07-20T12:58:26.497 に答える