テキストファイルがあります。その内容は以下の通りです。
$ 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
$ 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番目の式は␣␣*
、つまりスペースの後に0個以上のスペースが続くものに一致し、これらを1つのスペースに置き換えます。 2番目の式は行全体に適用され、tr -s ' '
と同じ効果があります。つまり、連続する複数のスペースを単一のスペースに圧縮します。
awk
の使用:
awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt
ここでは、フィールド区切り文字として]
またはスペースまたはタブを使用します(これらの倍数は2つの列を区切る場合があるため、*
の後に[...]
を使用します)。これらのセパレータを指定すると、必要なデータは各行のフィールド3および4で利用できます。
質問のデータを編集して、最後の2つの列の間のスペースをいくつか削除した後、次の操作も機能します。
cut -d ']' -f 3 file.txt
あるいは、単に
sed 's/.*]//' file.txt
または
awk -F ']' '{ print $3 }' file.txt
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
Awkの使用:
$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
2番目のパラメータ$2
は、最初に見つかった]
からのsubstr
を使用して切り捨てられます。次に、パラメーター2と3が印刷されます。
カットあり
cut -d ] -f3 file.txt
別のawk提案
awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5