最初の行に「StockID」と「SellPrice」という文字列を含むすべてのファイルを見つける必要があります。
以下はいくつかのファイル例です。
1.csv:
StockID Dept Cat2 Cat4 Cat5 Cat6 Cat1 Cat3 Title Notes Active Weight Sizestr Colorstr Quantity Newprice StockCode DateAdded SellPrice PhotoQuant PhotoStatus Description stockcontrl Agerestricted
<blank> 1 0 0 0 0 22 0 RAF Air Crew Oxygen Connector 50801 1 150 <blank> <blank> 0 0 50866 2018-09-11 05:54:03 65 5 1 <br />\r\nA wartime RAF aircrew oxygen hose connector.<br />\r\n<br />\r\nAir Ministry stamped with Ref. No. 6D/482, Mk IVA.<br />\r\n<br />\r\nBrass spring loaded top bayonet fitting for the 'walk around' oxygen bottle extension hose (see last photo).<br />\r\n<br />\r\nIn a good condition. 2 0
<blank> 1 0 0 0 0 15 0 WW2 US Airforce Type Handheld Microphone 50619 1 300 <blank> <blank> 1 0 50691 2017-12-06 09:02:11 20 9 1 <br />\r\nWW2 US Airforce Handheld Microphone type NAF 213264-6 and sprung mounting Bracket No. 213264-2.<br />\r\n<br />\r\nType RS 38-A.<br />\r\n<br />\r\nMade by Telephonics Corp.<br />\r\n<br />\r\nIn a un-issued condition. 3 0
<blank> 1 0 0 0 0 22 0 RAF Seat Type Parachute Harness <blank> 1 4500 <blank> <blank> 1 0 50367 2016-11-04 12:02:26 155 8 1 <br />\r\nPost War RAF Pilot Seat Type Parachute Harness.<br />\r\n<br />\r\nThis Irvin manufactured harness is 'new old' stock and is unissued.<br />\r\n<br />\r\nThe label states Irvin Harness type C, Mk10, date 1976.<br />\r\nIt has Irvin marked buckles and complete harness straps all in 'mint' condition.<br />\r\n<br />\r\nFully working Irvin Quick Release Box and a canopy release Irvin 'D-Ring' Handle.<br />\r\n<br />\r\nThis harness is the same style type as the WW2 pattern seat type, and with some work could be made to look like one.<br />\r\n<br />\r\nIdeal for the re-enactor or collector (Not sold for parachuting).<br />\r\n<br />\r\nTotal weight of 4500 gms. 3 0
2.csv:
id user_id organization_id hash name email date first_name hear_about
1 2 15 <blank> Fairley [email protected] 1129889679 John 0
最初の行に「StockID」と「SellPrice」を含むファイルだけを探したいです。したがって、この例では ./1.csv だけを出力しようとします。
私はこれをすることができましたが、今は詰まっています;(
where=$(find "./backup -type f)
for x in $where; do
head -1 $x | grep -w "StockID"
done
答え1
find
+awk
解決策:
find ./backup -type f -exec \
awk 'NR == 1{ if (/StockID.*SellPrice/) print FILENAME; exit }' {} \;
キーワードの順序が異なる場合は、パターンを/StockID.*SellPrice/
で置き換えます/StockID/ && /SellPrice/
。
ファイルの数が多い場合、より効率的な選択肢は次のとおりです(一度に複数のファイルを処理します。コマンドへの呼び出しの総数は一致するファイルの数よりはるかに少なくなります)。
find ./backup -type f -exec \
awk 'FNR == 1 && /StockID.*SellPrice/{ print FILENAME }{ nextfile }' {} +
答え2
GNUgrep
または互換製品を使用してください。
grep -Hrnm1 '^' ./backup | sed -n '/StockID.*SellPrice/s/:1:.*//p'
再帰 grep は、各ファイルの最初の行を印刷して印刷します。filename:1:line
いいえファイル全体を読み取り(この-m1
フラグを使用すると、最初の一致時にファイルを終了する必要があります)、そのセクションがパターンと一致する場所がsed
印刷されます。filename
line
失敗し、ファイルが表示されます。名前これにはそれ自体または改行文字が含まれていますが、各ファイルに対して異なるプロセスを実行する遅い+組み合わせを追加する:1:
よりも価値があるリスクです。find
awk
答え3
ファイルごとに1つのコマンドを実行してファイル全体を読み取らないようにするには、GNUを使用しますawk
。
(unset -v POSIXLY_CORRECT; exec find backup/ -type f -exec gawk '
/\<StockID\>/ && /\<SellPrice\>/ {print FILENAME}; {nextfile}' {} +)
または以下を使用してzsh
:
set -o rematchpcre # where we know for sure \b is supported
for file (backup/**/*(ND.)) {
IFS= read -r line < $file &&
[[ $line =~ "\bStockID\b" ]] &&
[[ $line =~ "\bSellPrice\b" ]] &&
print -r $file
}
または:
set -o rematchpcre
print -rl backup/**/*(D.e:'
IFS= read -r line < $REPLY &&
[[ $line =~ "\bStockID\b" ]] &&
[[ $line =~ "\bSellPrice\b" ]]':)
あるいは、基本拡張正規表現をサポートするシステムでは、単語境界演算子bash
(他のシステムでは/または試してみることもできます):\<
\>
[[:<:]]
[[:>:]]
\b
RE1='\<StockId\>' RE2='\<SellPrice\>' find backup -type f -exec bash -c '
for file do
IFS= read -r line < "$file" &&
[[ $line =~ $RE1 ]] &&
[[ $line =~ $RE2 ]] &&
printf "%s\n" "$file"
done' bash {} +
答え4
egrep
+ awk
:
egrep -Hrn 'StockID|SellPrice' ./backup | awk -F ':' '$2==1{print $1}'