共通の行を取得するには、次のような簡単なことを行うことができます
awk 'NR==FNR{x[$1]=1} NR!=FNR && x[$1]' file1 file2
これでリストが残り、要素を範囲にグループ化する必要があります。これは単純な awk スクリプトです。
awk 'NR==1 {s=l=$1; next} $1!=l+1 {if(l == s) print l; else print s ":" l; s=$1} {l=$1} END {if(l == s) print l; else print s ":" l; s=$1}'
すべてを一緒に入れて:
awk 'NR==FNR{x[$1]=1} NR!=FNR && x[$1]' file1 file2 | awk 'NR==1 {s=l=$1; next} $1!=l+1 {if(l == s) print l; else print s ":" l; s=$1} {l=$1} END {if(l == s) print l; else print s ":" l; s=$1}'
説明:
現在の範囲の開始と最後に見た値を追跡します。
NR==1 {s=l=$1; next}
NR==1 は最初の行でのみ実行されます。これは常に範囲の最初の要素になります。次は他のコマンドをスキップします。
$1!=l+1 {if(l == s) print l; else print s ":" l; s=$1}
実行に区切りがある場合、特定の行 ($1) の値は最後の行 (l + 1) の後の値にならないため、範囲を出力します。開始と終了が同じ場合、単一の数値を出力します。それ以外の場合は、開始、コロン、終了の順で出力します。
{l=$1}
範囲チェックを行った後、最後の行を更新します。
END {if(l == s) print l; else print s ":" l; s=$1}
最後にもう一度ロジックを実行して、最後の範囲を出力する必要があります