約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
- 重複項目リストを繰り返して発生するすべての項目を検索し、重複項目が発生したファイル名と行番号を出力します。