2

2 つのファイルでコマンド値を取得して書き込む Bash スクリプトは、新しいファイルへのパターンです

2 つのファイルで共通の値を見つけて、特定のパターンで新しいファイルに書き込むには、bash スクリプトが必要です。共通の値を取得できますが、パターンを機能させることができません。

$ cat file1
1
2
3
4
6
7
8
10
12
13
16
20
21
22
23
27
30

$ cat file2
1
2
3
4
8
10
12
13
16
20
21
22
23
27

Desired output:

1:4
8
10
12:13
16
20:23
27
4

1 に答える 1

3

共通の行を取得するには、次のような簡単なことを行うことができます

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}

最後にもう一度ロジックを実行して、最後の範囲を出力する必要があります

于 2013-06-14T19:01:37.747 に答える