約120個のファイルがあり、各ファイルは1000行を超えています。
各行には独自のキーがあります。列は分離されています。
以下は行の例です。キー列(列11は常に列11です)は次のとおりです。2010\07\05\ITE854075_RECardProtectionlogi.msg
エラー: Null、データ: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|国が不明
一致するキー/ 11番目の列値を持つすべての行を見つける方法はありますか(全体の行が一致しません)。コマンドラインまたはスクリプトでこれを実行できますか?私はcygwinを使用します。
どうやって始めるのか分からないので、見つけられるように適切なコマンドだけを与えてくれてありがとう。
各行には独自のキーがあるため、行数だけキーを持つことができます。
私はスクリプトがディレクトリ全体で実行され、追加のユーザー入力なしですべてのファイルの重複キーを報告したいと思います。
キーを定義する列11。
答え1
「キー」が「列」を参照すると仮定すると、次のように使用できます。
cut -f 11 -d "|" $(find . -type f -iname "*.txt") | sort | uniq -d | sed 's/\\/./g' | while read duplicate; do grep -rHn "|$duplicate|" * ; done
ログファイルの拡張子で内容を変更する必要があるかもしれません$(find -iname)
(またはディレクトリ内の唯一のファイルがログファイルの場合は削除する必要があります。これにより、すべてのログファイルを再帰的に見つけて一致させます。
一部のテストデータの出力は次のとおりです。
test_data.txt:1:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data.txt:5:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data_2.txt:2:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data.txt:3:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data_2.txt:4:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known test_data.txt:7:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known
これは、フィールド 11 が繰り返されるファイルのすべての行です。
このコマンドの機能の説明です。
cut -f 11 -d "|"
11番目のフィールドをインポートする(|で区切り)
find . -type f -iname "*.txt"
現在のディレクトリで.txtで終わるすべてのファイルを(再帰的に)考慮します。
sort | uniq -d
「フィールド11」の重複項目をすべて表示
sed /\\/./g'
これはbashを台無しにすることができるのでハッキングです\
。これを.
すべての文字と一致できる grep に置き換えます。
while read duplicate; do grep -rHn "|$duplicate|" *; done
- 重複項目リストを繰り返して発生するすべての項目を検索し、重複項目が発生したファイル名と行番号を出力します。
答え2
何をしたいのかわかりませんが、次のようにしてみましょう。
まず、あなたの道は何ですか?あなたはそれを一行で提供します:
Error: null, Data:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2011\07\05\ITE854075_RECardProtectionlogi.msg|Country not known
行が次の場合、キーはフィールド11にあります。
2011\07\05\ITE854075_RECardProtectionlogi.msg
しかし、キーを定義するものは何ですか? 11回目のゲームにしかないのですか?
その場合は、ターゲットファイルがあるディレクトリで次のことができます。
sort --field-separator='|' --key=11 <(\grep --recursive --line-number --color=always --with-filename '' *)
これにより、ファイル名のカラー出力が提供され、その後にそのファイルの行番号が表示され、行自体がすべてキーフィールド11にソートされるため、出力にすべてのファイルの一致するすべてのキーが順番に表示されます。 .....
私はこれが少なくともあなたに手がかりを与えると思います
ノート:前のバックスラッシュはエイリアシングをgrep
防ぐためのものですgrep
。