私のファイルには次の内容があります
foobar bar
bar foo foo
bar bar foobar
すべての行の最後の文字(最後の3文字)を取得したいと思います。
目的の出力を取得するには、次のforループ回避策を使用していますが、cut
コマンドはこれより良い結果を得ることができるようです。 Cutで同じことをする方法はありますか?
$ cat test.sh
FILE=$1
echo "Last chars:"
for i in $(cat $FILE)
do
echo ${i: -1}
# OR echo $i |tail -c 2
done
echo
echo "Last 3 chars:"
for i in $(cat $FILE)
do
echo ${i: -3}
# OR echo $i |tail -c 4
done
$ sh test.sh
Last chars:
r
r
r
o
o
r
r
r
Last 3 chars:
bar
bar
bar
foo
foo
bar
bar
bar
答え1
cut
1行自体には「最後のN文字」という概念はありません。ただし、rev
これをプログラムと組み合わせると、各行を反転できます。最初N文字を入力し、結果を反転して元の順序に復元します。
rev | cut -c 1-3 | rev
答え2
cut
GNUシステムを使用している場合は、シングルバイト文字でのみ機能する状況を避けたい場合があります。
あなたが使用できるsed
:
sed -n '/^.*\(...\)$/\1/p' < file
(一部の実装では、3文字未満の行とテキストではなく行をスキップします。)
または、3文字未満の文字を含む行でその内容のみを印刷します。
sed -n 's/.\{0,3\}$/\
&/; s/^.*\n//p' < file