CSVファイルで一致するパターンのみを探す

CSVファイルで一致するパターンのみを探す

CSVファイルから一致するパターンのみを印刷しようとしています。例:で始まるすべての列値35=its value。ありがとうございます。

CSVファイル:

35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1

出力:

35=A
35=BCD
35=EF
35=G

私が使用したコマンドは機能しません。

sed -n '/35=[A-Z]*?/ s/.*\(35=[A-Z]*?\).*/\1/p' filename

答え1

trすべてのカンマを改行文字に置き換えてから、文字列grepで始まるすべての行を取得するために使用されます35=

$  tr ',' '\n' <data.in | grep '^35='
35=A
35=BCD
35=EF
35=G

答え2

一致する文字列のみを1行に印刷するオプションをGNU grepサポートするには、これを使用します。-o

$ grep -oE '\b35=[^,]+' ip.csv 
35=A
35=BCD
35=EF
35=G
  • \b単語の境界なので900035一致しません。
  • [^,]+1 つ以上の,文字以外の一致
  • 値に以下が含まれていないと仮定,


そしてawk

$ awk -F, '{ for(i=1;i<=NF;i++){if($i~/^35=/) print $i} }' ip.csv 
35=A
35=BCD
35=EF
35=G
  • -F,,入力フィールド区切り文字として設定
  • for(i=1;i<=NF;i++)すべてのフィールドにわたって繰り返し
  • if($i~/^35=/)フィールドが次から始まる場合35=
    • print $iこのフィールドを印刷してください

似ているperl

perl -F, -lane 'foreach (@F){print if /^35=/}' ip.csv 

答え3

パールの使用:

$ perl -lne 'print for /(\b35=[^,]+)/g' filename
35=A
35=BCD
35=EF
35=G

あるいは、より一般的に/強く使用することもできます。テキスト::CSVモジュール

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()} 
  print for grep { /^35=/ } $p->fields(), $p->parse($_)
' filename
35=A
35=BCD
35=EF
35=G

答え4

純粋なBashソリューション:

(                                                  # Use parentheses as scope for IFS
    IFS=$',\n'                                     # Split on both , or \n
    for c in $(</tmp/file.csv)                     # For every column or row
    do
        [[ "$c" =~ ^35= ]] && echo ${line##35=}    # Find ^35= and print while removing ^35=
    done
) # Optionally >/tmp/filtered-output.txt

ノート、読みやすさと柔軟性のためにのみ使用してください - 読める場合それ以外の場合は、次の方法を使用できます。

# Read            | Replace     | Find        | Remove
cat /tmp/file.csv | tr ',' '\n' | grep '^35=' | sed 's/^35=//'

これはより直感的で効率的です。

入力(/tmp/file.csv):

35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1

出力:

A
BCD
EF
G

関連情報