次のプレーンテキストファイルがあります。
*,cli-verify-aggregation-general,./link-aggr/aggregation.xls
-,stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls
「-」で始まる行だけを含む他のファイルが必要です。
結果ファイル:
stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls
「-」があってはなりません。
ベストアンサー1
欲しいものを達成する方法はいくつかあります。入力ファイルが呼び出され、出力が出力されると仮定input.txt
すると、output.txt
次のようになります。
1.awk
使用方法及びcut
awk '/^-/' input.txt | cut -d "," -f 2- > output.txt
これは、aで始まるすべての行をawk
一致させ、一致する行を標準出力に印刷するように指示します(これはデフォルトのジョブであるため、明示的に指定する必要はありません)。input.txt
-
これはへの入力としてパイプされ、cut
各コンマ()で行を区切り、次-d ","
を除いて識別されたすべてのフィールドを印刷します。第二()、削除したい先行を省略します-f 2-
。-
その後、出力はファイルにリダイレクトされます。
詳細は以下で確認できます。GNU Awkユーザーガイド興味があれば。
2.grep
使用方法及びcut
この「簡単な」設定では、代わりにawkを使用することもでき、grep
同様の効果があります。
grep "^-" input.txt | cut -d "," -f 2- > output.txt
使用する正規表現は同じです。つまり、aと一致するが-
その行の最初の文字として現れる場合にのみ当てはまります(これはまさに上記の意味です^
)。
3. 使用方法sed
sed
最後に、以下を使用してこれを達成することもできます。
sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt
これはsed
、2つのルールを使用して処理することを示します。input.txt
- まず、入力からすべてのファイルを削除します。いいえ
-
:firstで始まる^
ということは、まだ次の行の最初の文字として現れるべきですが、表現では[ ... ]
「」を意味します。とは別にa-
". そのような行が見つかると削除されます(心配しないでください。sed
オプションを指定しない限り、入力ファイルには触れません-i
)。 - 次に、すべての入力行で(
s/.../.../
)の先頭-,
を...スペースに置き換えます(したがって削除します)。
出力はファイルにリダイレクトされます。
@Sundeepが指摘したように、これは次のことを宣言してより簡潔な単一の規則に置き換えることもできます。
sed -n 's/^-,//p' input.txt > output.txt
sed
これを開始するすべての行から先行を削除し、一致する行-,
(末尾)のみを印刷し、p
出力をファイルにリダイレクトするように指示します。ノート-n
いわゆる出力を抑制するには、ここでオプションが重要です。パターン空間これは達成しようとする目標を妨げる。