
テキストファイルがあります。内容は次のとおりです。
$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5
awkを使用して最初の列を正常に削除できますが、文字列に関連付けられているため、[num]文字を削除することはできません。
以下のような出力を取得しようとしています。
$ cat file.txt
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
答え1
$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
sed
最後の行まで(および含む)行のすべての内容を削除し、]
複数tr
の連続した空白を単一の空白に圧縮します。
または以下を使用してくださいsed
。
sed -e 's/.*]//' -e 's/ */ /g' file.txt
与えられた入力データを使用すると、最初のパイプラインと同じ出力が生成されます。
sed
これを最初に実行すると、s/.*]//
以前のすべての項目が削除(含まれています)されます]
。 2番目の式は、␣␣*
空白の後にゼロ個以上の空白が続くものと一致し、それを単一の空白に置き換えます。 2番目の式は行全体に適用され、同じ効果を持ちますtr -s ' '
。つまり、複数の連続したスペースを単一のスペースに圧縮します。
使用awk
:
awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt
ここでは、スペースまたはタブをフィールド区切り文字として使用します]
(これらのうち2つ以上が2つの列を分離できるため、*
後で使用します[...]
)。これらの区切り文字を使用すると、各行のフィールド 3 と 4 で必要なデータを使用できます。
最後の2つの列の間にあるスペースを削除するために質問のデータを編集した後、次の操作も実行されます。
cut -d ']' -f 3 file.txt
それとも
sed 's/.*]//' file.txt
または
awk -F ']' '{ print $3 }' file.txt
答え2
あなたはそれを使用することができますsed
$ sed -e 's/.*]//g' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
` awkを使うことができます。
$ awk -F'.*]' '{print $2}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
答え3
awkを使用してください:
$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
2番目の引数は、最初に見つかった引数を$2
使用して切り捨てられます。その後、パラメータ2と3が印刷されます。substr
]
答え4
別のawk提案
awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5