0

次のようなファイルがあります。

abs=1 sin=2.1 cat=曲線=3
abs=2 sin=3.4 cat=ノコギリ線=8
abs=7 sin=6.3 cat=四角線=4

実際には、さらにいくつかのフィールドがあり、すべての行にすべてのフィールドがあるわけではありません。とにかく、ユーザーが保持したいタプルの「マスク」(abs、lineなど)を定義できるスクリプトを書きたいと思います。スクリプトは、指定されたフィールドの値のみを含むファイルのより小さなバージョンを出力します。

たとえば、スクリプトに入力パラメータ「abs,line」を指定すると、次のように出力されます。

abs=1 line=3
abs=2 line=8
abs=7 line=4

私は bash でこのようないくつかのことを行っており、bash スクリプトに統合したいと考えています。私は awk がこれを行うことができるに違いないと考えていますが、その方法がよくわかりません。

4

3 に答える 3

2

コメントでグレンによって提案されているように、マスクをパディングするように更新されました。これにより、マッチングがより堅牢になります。

mask=abs,line
awk -v mask=$mask -v RS='[\n ]' -v FS='=' -v ORS='' '
  BEGIN { mask="," mask "," }
  mask ~ "," $1 "," { print $1 FS $2 RT }
'

mask抽出するパラメータのコンマ区切りリストに変数を設定することに注意してください。

レコードは改行またはスペースで区切られ、最後に で再挿入されRTます。

出力:

abs=1 line=3
abs=2 line=8
abs=7 line=4
于 2012-08-27T16:34:04.110 に答える
1

単一のコンマ区切りのパラメーターではなく、パラメーターを作成して分離し、スクリプトを次のようにしますabsline

#!/bin/bash
declare -A keep;

# read variables to keep from command line into associative array
while (( $# )); do
  keep[$1]=1
  shift
done

# process input
while read -r; do
  read -a args <<<"$REPLY"
  for arg in "${args[@]}"; do
    key=${arg%=*}
    value=${arg#*=}
    if [[ ${keep[$key]} ]] ; then
      printf '%s=%s ' "$key" "$value"
    fi
  done
  printf '\n'
done

次に、次のようにスクリプトを実行します。

./yourscript abs line <input.txt
于 2012-08-27T15:55:16.173 に答える
0

を使用した他のアプローチawk

質問に貼り付けられたコンテンツを想定infileして、マスクを作成し、次のスクリプトを実行します。

m="abs,line,cat"; awk -v mask="$m" '
    BEGIN {
        OFS = " ";

        ## Set fields of the mask as keys of an array.
        ret = split( mask, arr, /,/ );
        for ( i = 1; i <= length( arr ); i++ ) {
            mask_arr[ arr[i] ] = 1;
        }
    }

    ## Go throught all fields, extract the first part until the equal sign,
    ## search it in the array and print if found.
    {
        for ( i = 1; i <= NF; i++ ) {
            if ( substr( $i, 1, index( $i, "=" ) - 1 ) in mask_arr ) {
                printf "%s%s", $i, OFS;
            }
        }
        printf "\n";
    }
' infile

結果は次のとおりです。

abs=1 cat=curve line=3 
abs=2 cat=sawtooth line=8 
abs=7 cat=square line=4
于 2012-08-27T18:41:26.570 に答える