ファイルの各行に最初に表示される番号をキャプチャする方法はありますか?
test
たとえば、次のような内容のファイルがあります。
AA111 1 DFJKD BKJ3 () A G C TT
BB112 DKFJ 32 JDKFJ JE () DF
113 BDNF 33 3()
希望の出力は
111
112
113
入力の各行は英数字(たとえば、文字または数字、特殊文字なし)で始まります。
答え1
以下はいくつかの方法です。
sed 's/^[^0-9]*\([0-9]\+\).*/\1/' test
cat test | tr -c '0-9\n' ' ' | while read first rest; do echo $first; done
gawk -F '[^0-9]+' '{print $2}' test # requires non-digits to start line
perl -nE'say/(\d+)/?$1:""' test # code golf
大きな打撃:
while read line; do [[ $line =~ [[:digit:]]+ ]] && echo ${BASH_REMATCH[0]} || echo; done
答え2
sedでこれを行う1つの方法は次のとおりです。
sed -n 's/^[^[:digit:]]*\([[:digit:]]*\).*/\1/; /[[:digit:]]/p' test > test.out
これ:
- 数字ではなく潜在的な先行文字を削除し、
- 数字と(他のもの)をキャプチャして
\1
()数字に置き換えます。 - 行に数字が含まれている場合は印刷します(それ以外の場合、デフォルトはその
-n
行を印刷しないことです)。
(私の元のsedステートメントをいくつか圧縮するよう奨励したglennに賛辞を送ります)
答え3
grepを使用してください。
grep -oP '^\D*\K\d+' File