この問題を解決するのに役立つことを願っています。
列の最初の5つの要素を残りの要素(列別)と比較したいと思います。
- 最初の5つの要素が同じ場合 - >続行
- 最初の5つの要素が残りの要素と同じで、異なる場合は、次の列を印刷してください。
テーブルには、TABSで区切られた100以上の列と12行があります。
入力例:
ジョン・ローラ・ベン・クリス・ダン・トム ジョン・ローラ・ベン・レーン・ダン・トム ジョン・ローラ・ベン・クリス・ダン・トム ジョン・ローラ・ベン・クリス・ダン・トム ジョン・ローラ・ベン・クリス・ダン・トム デイブローラテイラークリスドナサラ デイブローラ・ホビークリス・ダン・サラ
希望の出力:
ジョン・ベン・トム ジョン・ベン・トム ジョン・ベン・トム ジョン・ベン・トム ジョン・ベン・トム デイブテイラーサラ デイブ・ハビサラ
皆さんの考えや意見に心から感謝します。
ありがとう
答え1
通常、行(行)で作業するのが最善です。awk
一度に1行ずつ作業するのと同じツールです。列を行に変換(転置など)するには、次のようにします。牛に似た一種の栄養datamash
。その後、各行をawk
個別にテストして、適切に印刷または印刷しないことがあります。最後に、datamash
再度使用して結果を元の形式に置き換えます。
<data datamash transpose | awk '{
for (i=2; i<=5; i++) if ($1!=$i) next
for (i=6; i<=NF; i++) if ($1==$i) next
print
}' | datamash transpose
論理的な説明は次のとおりです。
- 2..5のフィールドがフィールド番号1と異なる場合、最初のフィールドは行をスキップして再開
for
します。 5つのフィールドがすべて同じでなければ、プログラムは次のコード行を実行し続けることができます。 for
次のフィールドのうち最初のフィールドと同じフィールドがある場合、2番目のフィールドは行をスキップして最初から再開します。- プログラムがこれら2つの
for
基準を超えた場合、あなたの基準と矛盾する条件がまったく見つからなかったことを意味します。これでのみライン全体を印刷できます。
メモ:
- 元の質問(転置する必要はありません)では、少なくとも1つの列が基準と矛盾しない場合にのみ、次の行を読んでください。データによっては、最初の数行を読み取った後、すべての列が不一致として宣言されることがあります。この場合、アルゴリズムはすぐに終了し、何も印刷しない可能性があります。ただし、
datamash transpose
データに関係なく、ファイル全体(またはストリーム)を読み取って処理する必要があります。この場合、私の解決策は理想的ではありません。 - うまくいかない場合は解決策が
datamash
ありますawk
ここ。
答え2
列を行に置き換えてから正規表現を実行して、印刷したい行を確認する必要があります。最初の5つの要素が同じ場合は、以下に同じ要素を再表示しないでください。最後に、結果を再転置して所望の出力を得る。
HTH。
rs -T inp |
perl -lane 'print if "@F" =~ /^(\S+)(?: \1){4}(?: (?:(?!\1(?=(?: |$))).)+)+$/' |
rs -T
出力:
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Dave Taylor Sara
Dave Harvey Sara