以下を含むファイルをフィルタリングするスクリプトを作成しています。
a:10
b:20
c:60
# comment
{{# random mustache templating}}
d=4
e=6
結果の出力は次のとおりです。
a
b
c
d
e
これは私の命令です。
cat filename.txt | awk '{$1=$1;print}' | awk -F'{{' '{print $1}' | awk -F'=' '{print $1}' | awk -F':' '{print $1}' | awk -F'#' '{print $1}' | awk /./
目的:
- 「=」または「:」文字が表示される行のすべての項目を削除します。
- テンプレートを削除するには、「{{」で始まる行を削除してください。
- 各行の先頭と末尾のスペースを切り捨てます。
- 空白行をすべて削除します。
私はbashを初めて使用するのにどのようにこのコマンドを短くすることができますか?
答え1
フィールド区切り文字は完全な正規表現である可能性があるため
awk -F'[:#=]' '!/^{{/ && length($1) > 0 { split($1, a, " "); print a[1] }' filename.txt
十分です。 ":"、"#"、"="のいずれかが区切り文字として機能します。 「{{」で始まる行を除いて、$1
空でない行を一致させ、$1
空白に分割し、最初の結果フィールドを印刷します。
答え2
作業を簡単にしてください。
$ awk 'NF && ($1 !~ /^(#|\{+)/) { sub(/[:=].*/,""); print $1 }' file
a
b
c
d
e
答え3
上記の結果を得るために、正規表現をフィールド区切り文字として使用し、正規表現を使用して行を選択し、{print $1}
最初の列を印刷しました。
あなたの例には前のスペースや空白行は表示されませんが、それを処理する必要がある場合は、以下のコマンドのバリエーションをご覧ください。
awk -F'[:=]' '!/^[#{]/{print $1}' filename.txt
結果:
a
b
c
d
e
先頭または末尾の空白がある場合は、次のことができます。しかし、例を見ないと想像するのが難しいことは認めます。
awk -F'[:=]' '{gsub(/^\s+|\s+$/,"",$1)} !/^[#{]/{print $1}' filename.txt
すべての可能なシナリオに対処するために、あなたのコメントに基づいて例を修正しました。これで、先頭と末尾のスペースと空白行があります。
a:10
b :20
c:60
# comment
{{# random mustache templating}}
d=4
e =6
この問題を処理するために少し変更されたコマンドは次のとおりです。
awk -F'[:=]' '{gsub(/^\s+|\s+$/,"",$1)} !/^[#{]/ && !/^$/{print $1}' filename.txt
- フィールド区切り正規表現は、
$1
最初のフィールドを後ろのすべてのフィールドから分離します。:
=
- gsub はすべての先行スペースと末尾のスペースを削除します。
- 以前の正規表現は、コメント、「テンプレート」、および空白行を除外するために、またはで始まる
{print $1}
すべての行を削除します。#
{
これにより、次のような結果が生成されます。以下で修正された例:
a
b
c
d
e
答え4
おそらくこれはあなたが望む結果を得るのに役立ちます。
#!/bin/bash
dynamic_array=()
while read -r line
do
var=$(echo "$line" | cut -c 1)
if ! { [ "$var" = '#' ] || [ "$var" = '{' ] || [ "$var" = '}' ]; }
then
dynamic_array+=("$var")
fi
done < A.txt
str_array_value="${dynamic_array[*]}" ; echo "$str_array_value" | tr ' ' '\n' | awk '!seen[$0]++'
出力:
a
b
c
d
e