条件に一致する行の選択された部分を印刷するコマンドを探しています。たとえば、私のテキスト行は次のようになります。
p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X
。Y
この例で予想される結果はですp2,p6
。
答え1
以下では、P
erl準拠の正規表現を使用してくださいgrep
。
grep -Po '..(?==Y)' <file
結果:
p2
p6
答え2
この試み:
echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'
出力:
p2,p6
答え3
awk
選択した正規表現区切り記号に基づいてレコードを読み取ることができます。たとえば、'[|\n]'
選択した区切り文字に従ってレコードをフィールドに分割することもできます。例えば。'='
三項演算子は(condition)?:
先行カンマを防止します。
awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'
出力:
p2,p6
末尾の改行が必要な場合は、END{}
セクションに追加できます。一致するものがない場合に改行文字が出力されないようにするには、ORS
出力レコード区切り文字()を最初に次のように設定できます。まったくを選択し、\n
一致するものがあるかどうかを設定します。
awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'
答え4
シンプルなawk
awk -F\| '{for (i=1 ; i<= NF; i++)
if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'
どこ
-F\|
|
区切り文字として使用{for (i=1 ; i<= NF; i++)
スキャンパターンif ( $i ~/Y/ )
見つかったら{ split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}
分割と印刷
出力
in 3 : p2
in 11 : p6
printf "%s\n",A[1]
パターン番号をスキップするために使用されます。