私はこれを使って ".txt"ファイルのすべての名前を1つのファイルに入れます。
find . -name "*.txt" | sort > txtfile
txtfileにリストされているすべてのファイルの最初の20行をすべて表示する方法(または20行未満の場合は空白行を提供)は何ですか?
答え1
ファイル名はファイル内の改行で区切られているため、txtfile
各ファイルを読み取り、行数が同じか(または20より大きいか)を確認し、その場合は最初の20行を印刷し、そうでない場合は残りの行の改行を印刷できます。 :
while IFS= read -r f; do
lines=$(wc -l <"$f")
if (( lines < 20 )); then
cat -- "$f"
for ((i=20; i>lines; i--)); do
echo
done
else
head -20 -- "$f"
fi
done <txtfile
答え2
awk
これをサポートするルールがある場合は、ENDFILE
次のことができます。
xargs -a txtfile awk 'FNR <= 20 {print} ENDFILE {for (n=FNR+1;n<=20;n++) print ""}'
各ファイルにヘッダーがあることが気に入らない場合は、pr
「ページ」を使用して各ファイルの最初の20行を印刷できます。
xargs -a txtfile pr +1:1 -l25
(残念ながらpr
ヘッダーを抑制するオプションがありますが、そのオプションはページ付けも抑制します)。もしあなたならするヘッダーに注意を払うと、ファイルを個別に処理してtail
次のように削除できます。
while read -r f; do
pr +1:1 -l25 "$f" | tail -n +6
done < txtfile
または(GNU sedの「nskipm」アドレス指定を使用)
xargs -a txtfile pr +1:1 -l25 | sed '1~25,+4d'