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