1

次のような区切りファイルがある場合。

A=1|B=2|C=3|D=4|E=5|F=6

また、特定のフィールドを抽出し、標準の UNIX ツール (つまり、grep、awk、cut) のみを使用して 1 行に出力したいと考えています。どうすればこれを行うことができますか?

テキスト フィールドは常に同じ順序であるとは限りません。フィールドの開始に基づいてフィールドを選択できるようにしたい。

したがって、上記の A= および C= に対するクエリは、次を 1 行として出力する必要があります。

A=1 C=2

ありがとう!

4

4 に答える 4

1

RSを正規表現として指定することをサポートするawkバージョンを使用することをお勧めします(例:gawkまたはmawk)。

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk -v RS='[|\n]' -v ORS=' ' -v pat='(A|C)=' '$0 ~ pat'; echo

または、最後にエコーを回避したい場合:

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk -v RS='[|\n]' -v ORS=' ' -v pat='(A|C)=' '$0 ~ pat; END { printf "\n" }'

お気に入り:

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk '$0 ~ pat' RS='[|\n]' ORS=' ' pat='(A|C)='; echo 

出力:

A=1 C=3

編集

バグ修正、改行もレコード区切り文字と見なす必要があります。

于 2013-01-29T10:32:44.363 に答える
0

sedの使用

sed -re 's/(A=[0-9]+)(.*)(C=[0-9]+)(.*)/\1 \3/' temp.txt

出力

A=1 C=3

于 2013-01-30T02:57:02.870 に答える
0

これを使用することもできます:

awk -F"|" '{for(i=1;i<=NF;i++){if($i~/[A|C]\=/)printf $i" "}}'

また、perl を使用することもできます:

perl -lne 'push @a,/[A|C]=\d+/g;END{print "@a"}'
于 2013-01-29T11:49:31.580 に答える
0

これはあなたのニーズに合っていますか?

kent$  echo "A=1|B=2|C=3|D=4|E=5|F=6"|grep -Po "(?<=\||^)(A=|C=)[^|]*"
A=1
C=3

1行で表示したい場合は、パイプしてくださいtr '\n' ' '

于 2013-01-29T10:31:30.730 に答える