2016-07-07 6 views
1

" - "で区切られた2つの値の間のすべての数値を出力しようとしています。 私はこのように見ている複数の行を持つ文書があります:私はのような結果が欲しい変数を " - "で区切って出力するにはawkを使用してください

14 - 19 | 
45 - 50 | 

14 15 16 17 18 19 
45 46 47 48 49 50 

しかし、私は、私が設定しているが、同じ行のすべての値を取得しておくとORSとOFS。

紛失しているものはありますか?

+1

あなたは 'awk'スクリプトを'#!/ usr/bin/awk -f'行を先頭にして独自のファイルに入れることができますdをファイル名を引数として独自のスクリプトとして実行しますか? – Kusalananda

答えて

2

が、これははるかに単純で直接的です::

あなたはprintf isteadを使用することができます

$ awk '{for (i=$1+0;i<=$(NF-1);i++){printf "%d ", i};print ""}' list.txt 
14 15 16 17 18 19 
45 46 47 48 49 50 

は、末尾の防止のためのスペース(感謝@fedorqui):

awk '{for (i=$1+0;i<$3+0;i++){printf "%d ", i};print ""$3}' list.txt 
+1

また、行の末尾に余白ができないようにするには、 '{for(i = $ 1; i <$ 2; i ++)printf"%d%s "、i、OFS; printf "%d%s"、$ 2、ORS} '。 – fedorqui

+0

ありがとうございました!それは動作し、スクリプトよりもはるかに簡単です! – olivia

+0

良い点@fedorqui – klashxx

1
#!/bin/bash 
awk ' BEGIN{OFS=" "; 
      RS="|"; 
      FS=" "; 
      ORS=" "}; 
{ 
    for (i=1; i<=NF ; i++) 
    { 
    if ($i == "-") 
    { 
     st=$(i-1); 
     en=$(i+1); 
     st++; 
     while (st < en) 
     { 
     print st; 
     st++; 
     } 
    } 
    else 
     print $i; 
    } 
}' list.txt 

print別レコードとして扱うので、末尾にORSを追加しています。

フィールドが固定されている場合は
#!/bin/bash 
awk ' BEGIN{ 
      RS="|"; 
      FS=" ";}; 
{ 
    for (i=1; i<=NF ; i++) 
    { 
    if ($i == "-") 
    { 
     st=$(i-1); 
     en=$(i+1); 
     st++; 
     while (st < en) 
     { 
     printf "%d ", st; 
     st++; 
     } 
    } 
    else 
     printf "%d " $i; 
    } 
    printf "\n" 
}' list.txt 
+0

この解決方法は、行が標準形式でない場合にも有効です。のような:2054 | 127 1702 - 1705 1707 1710 - 1713 1715 1723 1728 | 3061 3082 3526 3725 | – olivia

関連する問題