
複数のソートされたtxtファイルがあります。出力ファイルから収集する必要がある特定のデータがあります。
たとえば、
1.txt
Colour: Red
Hight: 10
2.txt
Colour: Blue
Hight: 12
sed / grepなどのbashコマンドを使用して特定の単語を検索し、特定の文字を無視してデータを取得して出力ファイルに入れる方法。
たとえば、
出力.txt
Colour Hight
Red 10
Blue 12
Aneesを助けてくれてありがとう
答え1
各ファイルに常に2つのフィールドがあり、常に同じ順序であると仮定すると、sedを使用してこれを行う1つの方法があります。
#!/bin/sh
printf '%s\t%s\n' Colour Hight
sed '
/ *Colour: */ {
s///
h
n
}
/ *Hight: */ {
s///
G
s/\n/\t/g
}
' "$@"
この回答では、hold space
sed の機能を使用して、1 行から次の行にデータ値を格納します。
{
ステートメントをグループ化するためにおよびを使用します}
。このグループのすべてのコマンドは、アドレス指定された行(この場合はパターン/ *Colour */
と選択された行)にのみ適用されます/ *Hight */
。
*Colour *
「色」と「高さ」の行から最初に*Higth *
(または)に一致するテキストを削除しますs///
。
「color」行にh
残りのテキストを保存します。hold space
、印刷せずに次の入力行にジャンプします(n
)。
Hight行は、G
改行文字「\ n」で連結された予約済みスペースの内容をパターンスペースにインポートまたは追加しますsed
。次に、対応する\t
改行文字をタブ文字に置き換えてsed
出力を印刷します。
この回答は、sed
Linux、FreeBSD、OS Xなど、すべてのバージョンに適用されます。
答え2
出力ファイルのヘッダーをこのように配置した
echo 'Colour Hight' > out.txt
後、各ファイルに対して次のことができます。
awk '{printf $2" ";next;}' 1.txt >> out.txt
または、すべてのtxtファイルに対して以下を実行できます。
ls *.txt | xargs awk '{printf $2" ";if (++onr%2 == 0) print "";next;}' >> out.txt