パイプ(|)で区切られたデータを含むフォルダがあります。ファイル名とともに、フォルダ内の各ファイルの最初の行の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)"
' {} {} \;