フォルダ内のすべてのファイルからデータを検索する

フォルダ内のすべてのファイルからデータを検索する

パイプ(|)で区切られたデータを含むフォルダがあります。ファイル名とともに、フォルダ内の各ファイルの最初の行の8番目の列のリストが必要です。これらすべてのデータを1つのファイルにまとめることができれば良いでしょう。

答え1

ファイルを転送するには、awkシェル globstar を使用できます。必要な-Fフィールド区切り文字を定義するために使用できます。-F'|'最初の行だけを取得する場合は、次のものを使用するだけでnextfile十分です。だから私たちはこれを行うことができます:

awk -F'|' '{print FILENAME,$8;nextfile}' ./*

ファイルがあるフォルダーから。

nextfileサポートされない可能性があることを確認してください。たとえば、Stephaneが指摘したように、Debianとその派生製品にはオプションのmawkない古いバージョンが付属していますnextfile。より移植可能なawkコードが必要な場合は、変数を利用できますFNR。たとえば、

awk -F'|' 'FNR==1{print FILENAME,$8}'  ./*

答え2

私はまだ好むがawk方法(より明確で、よりシェルに似ており、より効率的です。)シェルループを使用することは比較的うまく機能する状況です。

for file in *; do
  IFS='|' read -r x x x x x x x text x < "$file" || continue
  printf '%s\n' "$file: $text" || exit
done

答え3

find . ! -name . -prune -exec test -f {} \; -exec sh -c '
   printf "%s:%s\n" "$1" "$(head -q -n 1 "$1" | cut -d\| -f8)"
' {} {} \;

関連情報