2

私は自分の問題を解決する方法を探していましたが、あきらめました。私はスクリプト作成にかなり慣れていないので、ご容赦ください。これは私がやろうとしていることです:

6列のファイル(file1と呼びましょう)があります。最初の列には ID があり、7 番目には代替 ID がありますが、その列全体が空です:

ID col2 col3 col4 col5 col6 AltID AltID2
a   a    x    43   5    54   A1     D3
b   f    4    44   9    51   B3     KL5
c   h    k    90   0    52   K9     JD3
...

別のファイル セット (正確には 6 つ) があり、それぞれに 8 つの列があります (タブ区切りのファイルです)。4 番目の列には、File1 の ID と一致する ID が含まれています。col=ID ですが、順序はランダムです。

私がする必要があるのは、私が持っている他の 6 つのファイルの 4 列目の File1 から 1 列目の各行のすべての ID を検索し、一致する場合は、その一致を File1 の 7 列目に配置することです。

もう 1 つのトリッキーな点は、これらの ID の一部が完全に欠落しており (その場合は「x」が必要です)、別の場合には複数の代替 ID があります (この場合、それらを隣り合わせに配置します)。 File1 の 7 列目と 8 列目)

少しgrepを試してみましたが、awkの方が実際にはこれに適していると言っている人に出くわしました。スクリプトを作成してみましたが、次のようになりました。

#! /bin/bash

while read fn; do

STR =$(echo -ne "${fn}" ; awk '  { if($4=="${fn}") printf "%s\t", $7} ' ./*.txt)
echo $STR > test.txt

done < dreg.txt

それは明らかに機能しませんでした。コードは、自分が何をしているのかよくわからないように見えますが (そうではありませんでした)、ここから始めました。私は基本的に、テキストを含む最初の列のみで作成したダミー ファイルを読み込もうとして、そのディレクトリ内の他のすべてのテキスト ファイルのすべての行を検索していました。次に、見つかった場合は、ID の名前をエコーし​​、その後に代替 ID を続けて、次の形式を取得することを望んでいました。

ID AltID AltID2

私の計画は、これらの結果をファイルに出力してからそこから移動することでしたが、うまくいきませんでした。これは最も洗練されたソリューションではありませんが、前述したように、私はこれにあまり精通していません。

皆さんの助けがあれば大歓迎です。別の例が必要な場合、または私が物事を明確にする必要がある場合は、お知らせください。

前もって感謝します

4

1 に答える 1

2

仮定して

  • 2 つ以上の選択肢を持つ ID はありません
  • 代替 ID は「その他」ファイルの最初の列にあります
  • 一致するものが 1 つしかない場合は col8 ではなく、一致しない場合にのみ col7 に「x」を表示する必要があります。
  • いいえであり、代替IDに表示されない文字 ( DELIM) を1 つ指定できます。<TAB>
  • すべてのファイルのヘッダー行は1行だけです

次の解決策は私のために働く

$ cat file1
ID      col2    col3    col4    col5    col6
a       a       x       43      5       54
b       f       4       44      9       51
c       h       k       90      0       52
$ cat file2a
AltID   col2    col3    ID
A1      some    thing   a
B1      more    stuff   b
$ cat file2b
AltID   col2    col3    ID
A2      even    more    a
D1      random  stuff   d
$ cat test.awk
BEGIN {
   FS = "\t"
   OFS = FS
   DELIM = ";"
   MISSING = "x"
}
FILENAME != "file1" {
   if (FNR != 1) {
      alt[$4] = (alt[$4] ? alt[$4] "" DELIM : "") "" $1
   }
   next
}
FNR == 1 {
   $7 = "AltID"
   $8 = "AltID2"
   print
   next
}
{
   idcount = split(alt[$1], ids, DELIM)
   $7 = (idcount ? ids[1] : MISSING)
}
idcount > 1 {
    $8 = ids[2]
}
1
$ awk -f test.awk file2* file1
ID      col2    col3    col4    col5    col6    AltID   AltID2
a       a       x       43      5       54      A1      A2
b       f       4       44      9       51      B1
c       h       k       90      0       52      x

コメントで調整や説明をお気軽にお尋ねください。それに応じて回答を更新します。

于 2013-08-30T07:38:41.643 に答える