行に合わせて貼り付ける

行に合わせて貼り付ける

そのため、次の行で構成される非常に大きなテキストファイルが2つあります。

最初:

Robert:Dillain:Other:Other:Other
Julian:Brude:Other:Other:Other
Megan:Flikk:Other:Other:Other
Samantha:Minot:Other:Other:Other
Jesus:Kimmel:Other:Other:Other

第二:

Sb:Minot:amsen
Jbb:Kimmel:verlin
R:Dillain:bodent
Mb:Flikk:kentin
Jb:Brude:kemin

私はそれらを一致させたい2列(Dillain、Brudeなど)を次の行に貼り付けます。

出力:

Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen
etc...
etc...

私はsedそれを使用することを検討していますが、Unixベースなら何でもいいでしょう。私はこれを自分で行う方法を見つけることができませんでした。

答え1

これはミッションのように聞こえますjoin

join -t":" -o "1.1,1.2,1.3,1.4,1.5,2.1,2.2,2.3" \
   -j 2 <(sort -k2,2 -t: test1) <(sort -k2,2 -t: test2)

出力:

Julian:Brude:Other:Other:Other:Jb:Brude:kemin
Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Megan:Flikk:Other:Other:Other:Mb:Flikk:kentin
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen

分解:

  • -tフィールド区切り記号を次のように設定します。:
  • -o印刷形式の設定
  • -j列番号の関連付け2
  • <(sort -k2,2 -t: file)-k2番目の列に基づいてファイルを事前にソートし、-tフィールド区切り文字を次のように設定します。:

答え2

これは簡単な作業ですawk

awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$0;next}{print $0,a[$2]}' file2 file1

まず、入力(使用)と出力(使用)を:フィールド区切り文字に設定し、最初のファイル()を処理する場合は、行全体を2番目のフィールドでインデックス付けされたテーブル要素に割り当てます。次のファイル()が処理されたら、その行を印刷し、)に保存されている古いファイルの行を追加します。-FOFSfile2file1a[$2]

答え3

一緒ならsed、次のことができます。

sed 's|[^:]*:\([^:]*\).*|/^[^:]*:\1:/s/$/:&/;t|' file2 | sed -f - file1

sed... 2番目のファイルを読み、sed最初のファイルを2番目sedのファイルの標準入力として編集するスクリプトを作成するプロセスが必要です。私が知る限り、このような正規表現にコンテンツをそのまま挿入するのに問題はないはずです。入力にメタ文字がある可能性がある場合は、このサイトでメタ文字をエスケープする方法について説明する多くの回答があります。ただし、必要に応じて次の点で十分です。

sed 's|[]&\./*[]|\\&|g;s|...' ... | sed -f - file1

それでも同じ名前の解決策がjoinより良い解決策かもしれません。これはsed、あなたが言及した後にこれを行う方法を示すためのものです。

sedとにかく、2番目の適用可能なスクリプトはfile1次のとおりです。(file2の各行には次のような行があります):

/^[^:]*:Dillain:/s/$/:R:Dillain:bodent/;t

...つまり、一致する行が見つかった場合ディランコロンで区切られた2番目のフィールドの場合は追加する必要があります。:R:ディラン:ボーデント尾にひもで結んでください。 from行がすでに追加されている場合は、行を一致させようとしても意味がない可能性があるため、末尾のfile1estコマンドは完了するとすぐに成功した代替項目を分岐します。file2t

答え4

渡すPython 3

#!/usr/bin/python3
import csv
import sys
file1, file2 = sys.argv[1], sys.argv[2]
with open(file2) as second, open(file1) as first:
    second_list = second.readlines()
    first_list = first.readlines()
for line1 in first_list:
    for line2 in second_list:
        if line1.split(':')[1] == line2.split(':')[1]:
            print(line1.strip()+line2.strip())

上記のスクリプトをコピーしてscript.py。その後、端末で次のコマンドを実行してスクリプトを実行します。

python3 script.py file1 file2

関連情報