0

次のような 2 列のデータを含むファイル (file1) の場合:

1232323 dog 
21321   cat
21321   fox
2312323 bird

2 列のデータを含む 2 番目のファイル (file2) は、次のようになります。

dog red
cat blue
fox green
bird black

file1 の列 2 のすべてのエントリを繰り返し処理して、file2 の列 1 から一致するエントリを見つけ、file2 の列 2 のデータを検索に追加する 3 番目のファイルを作成するスクリプトを作成しようとしています。次のようにヒットします。

1232323 dog red
21321   cat blue
21321   fox green
2312323 bird black

ここにいくつかの擬似コードがあります:

For each string in field 2 of file1
    grep file2
    output field1 and field2 of file1 and matching field2 of file2 from any hits to file3

ありがとうございました。

4

4 に答える 4

0

このワンライナーは役立つかもしれません:

kent$  awk 'NR==FNR{a[$2]=$0;next}$1 in a{print a[$1],$2}' f1 f2
1232323 dog  red
21321   cat blue
21321   fox green
2312323 bird black

または参加して:

kent$  join -12 -21 -o 1.1 1.2 2.2 f1 f2
1232323 dog red
21321 cat blue
21321 fox green
2312323 bird black
于 2013-01-10T00:27:29.353 に答える
0

最もクリーンなbashのみのソリューションは、連想配列を使用する可能性が高く、bash>4が必要です。

#!/usr/bin/env bash

declare -A num_data
while read -r num animal; do
    num_data["$animal"]="$num"
done < file1

declare -A color_data
while read -r animal color; do
    color_data["$animal"]="$color"
done < file2

for i in "${!num_data[@]}"; do
    printf '%s %s %s\n' "${num_data[$i]}" "$i" "${color_data[$i]}"
done
于 2013-01-10T00:28:38.937 に答える
0

コマンドはjoin必要なものですが、入力ファイルはソートする必要があります。プロセス置換の使用:

join -1 2 -o 1.1,1.2,2.2 <(sort -b -k2 file1) <(sort file2)

生産する

2312323  bird  black
21321    cat   blue
1232323  dog   red
21321    fox   green

column -t出力をきれいにするために、結合コマンドをパイプしました。

于 2013-01-10T01:12:33.163 に答える
0

Perl ソリューションは次のとおりです。

# Usage:  perl datafind.pl > file3.txt

open FILE1, "<file1.txt" or die $!;
my @lines1 = <FILE1>;
close FILE1 or die $!;

open FILE2, "<file2.txt" or die $!;
my @lines2 = <FILE2>;
close FILE2 or die $!;

foreach(@lines1) {
    my($col11, $col12) = split(/\s+/);
    foreach(@lines2) {
        my($col21, $col22) = split(/\s+/);
        if($col12 eq $col21) {
            print "$col11 $_";
        }
    }
}
于 2013-01-10T00:41:45.383 に答える