
と同様に、標準入力のすべての行に対してコマンドを呼び出したいのですxargs
が、行はコマンドライン引数としてではなく、標準入力として渡す必要があります。
cat some-file.txt | <magic> | wc -c
- これにより、ファイルの各行の文字数が出力されます。
どのような選択肢がありますか?
答え1
シンプルなループはどうでしょうか
while IFS= read -r line ;
do
printf "%s" "$line" | wc -c
done < some-file.txt
答え2
while-read ループが最も明確です。xargs を使用して各行に対して何かを実行したい場合は、次のような怪物になってしまう可能性があります。
printf "%s\n" "foo bar" one " 1 2 3" |
xargs -d '\n' -n 1 -I LINE bash -c 'wc -c <<< "LINE"'
8
4
7
各行ごとに bash プロセスを生成する必要があるため、かなりコストがかかります。
答え3
cat file.txt | while IFS= read -r i; do echo -n "$i" | wc -c; done
## or (better):
while IFS= read -r i; do echo -n "$i" | wc -c; done < file.txt
しかし、これはただ1 行ごとに、行の文字数を出力します。より読みやすいものにしたい場合は、次のいずれかを使用します。
## Prints the contents of each line underneath the character count:
while IFS= read -r i; do echo -n "$i" | wc -c; echo "$i"; done < file.txt
## Prints the line number alongside the character count:
n=0; while IFS= read -r i; do n=$((n+1)); echo -n "line number $n : "; echo -n "$i" | wc -c; done < file.txt
携帯性を高めるために、すべてのsprintf '%s' "$i"
の代わりにecho -n
答え4
Zシェル
変数に行を格納することはオプションを使用することで回避できます-e
setopt pipefail
cat some-file.txt |
while read -re | wc -c
do
done
-r
\
そのままsと読む
-e
入力を変数に割り当てる代わりにエコーする
pipefail
は、ファイルの最後で が終了しread -re | wc -c
次第、非ゼロのステータスコードで終了します。read -re
残念ながら、このオプションはBashでは利用できません