私は大きなテキストファイルを持っていて、コマンドラインから各行の最初の4、最初の5、最初の8文字を印刷したいと思います。
たとえば、次の行があります。
123456789ab
ABCdefgih55
したがって、出力は次のようになります。
1234
ABCd
12345
ABCde
12345678
ABCdefgh
答え1
for len in 4 5 8; do
cut -c "1-$len" file
done
これはcut -c
、名前付きファイルの各行の最初の部分を切り取るために繰り返し使用されますfile
。カットビットの長さはループ変数によって異なりますlen
。
「一行」の基準に厳密に従う場合:
for len in 4 5 8; do cut -c "1-$len" file; done
または使いやすいシェル機能で:
cut_to_lengths () {
file=$1; shift
for len do
cut -c "1-$len" "$file"
done
}
それを書く:
$ cut_to_lengths file 4 5 8 1
1234
ABCd
12345
ABCde
12345678
ABCdefgi
1
A
存在するコメントラインが次の場合に出力しないことを指定します。短く切断の長さ。
これを行うには、cut
コマンドを次のように変更できますawk
。
awk -v len="$len" 'length >= len { print substr($0, 1, len) }'
上記のコードをcut -c "1-$len"
上記のコマンドで置き換えます。awk
答え2
あなたのサンプル形式が正しく指定されていません。空白が新しい行でなければならないと思いますか?もしそうなら、最も簡単な方法は以下を使用することです。cut
$ cut -c -4 input
各行の最初の4文字が印刷されます。必要なだけ多くの文字でこれを繰り返します。
答え3
以下を試してください
for line in `cat input`; do echo ${line} | cut -c 1-4 && echo ${line} | cut -c 1-5 && echo ${line} | cut -c 1-8; done
これは
1234
12345
12345678
ABCd
ABCde
ABCdefgi