2016-04-13 16 views
0

bash forループを使用して各エントリに番号を追加するにはどうすればよいですか?私はここに、この出力を探していますbashの各行に番号を関連付ける

for var in $(cat tmp), i in {1..7}; do echo $var:$i >> days_of_week; done 

Monday 
Tuesday 
Wednesday 
Thursday 
Friday 
Saturday 
Sunday 

Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 

答えて

1

私はsedで出力を再フォーマットし、その後cat -nで行に番号を付けるでしょう:

cat -n tmp | sed -r 's/([0-9]+)\s(.*)/\2:\1/' 
+1

のために設定されている場合

i=1; while read day; do echo $day:$i ((i++)) done <tmp >>days_of_week 

?そのコマンドの '/'と '\'の違いは何ですか?オスの何? –

+0

一般的な正規表現や特にsedの知識に少し依存することがあります。私は少なくともあなたにグローバルな視点を与えて、特定の方向に多くの情報が必要かどうか教えてください。sedを使って 's'置換コマンドを実行しています。そのフォーマットの1つは' s/pattern/replacement/'です。ここでは、グループ内の行の最初の数字と一致し、残りの行は別の行の数字と一致します。これは 'cat -n'のフォーマットにマッチします。最後に、置換パターンの逆参照を使用してこれらのグループを反転し、それらを ":"で結合します。 – Aaron

3

私が試したことは以下の通りでしたBash:

n=0 
while IFS= read -r day; do 
    printf "%s:%d\n" "$day" $((++n)) 
done < days_of_week 

これは、ファイルから名前を読み取り、インクリメントした後にカウンタを追加します($((++n))部分)。

かのawk:

$ awk '{print $0 ":" NR}' days_of_week 
Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 

$0は完全なレコード(この場合はライン)で、NRは、この場合には行番号と同じである「レコード番号」、です。

+0

awkコマンドでなぜ$ 0と何がNRですか? 1で始まり7で終わることをどのように知っていますか? –

+0

@ power_output私は少し説明を追加しました。 –

+0

whileループの場合、IFS、-r、およびprintfは必要ありません。それがなくてもエコーを使用する方がはるかに簡単です。 – SaintHax

0

これはかなり単純なものですが、カウンタを増やすだけです。インクリメントする前に、カウンタを初期化し、各行を読み込み、カウンタをタックします。あなたは本当にあなたが何をしている高levelofのビットを与えることができますループ

i=1; for day in $(cat tmp); do 
    echo $day:$i 
    ((i++)) 
done >>days_of_week 
0
$ awk '{print $0 ":" NR}' <<EOF> days_of_week 
> Monday 
> Tuesday 
> Wednesday 
> Thursday 
> Friday 
> Saturday 
> Sunday 
> EOF 
$ cat days_of_week 
Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 
関連する問題