
複数の行があり、各行に2つの異なるフィールドが必要な状況があります。具体的には、参考文献に参考文献リストがありますが、実績年度を知りたいです。
入力例:
Aloise-Young, P.A. (1993). The development of self-presentation. Self-promotion in 6- to 10-year-old children. Social Cognition, 11, 201-222.
Banerjee, R. (2002). Children's understanding of self-presentational behavior: Links with mental-state reasoning and the attribution of embarrassment. Merril-Palmer Quarterly, 48, 378-404.
Bennett, M., & Wellman, H. (1989). The role of second-order belief-understanding and social context in children's self-attribution of social emotions. Social Development, 9, 126-130.
希望の出力:
Aloise-Young 1993
Banerjee 2002
Bennett 1989
城がわかりますか?cat file | cut -d, -f1
私は年を得ることができますcat file | grep -o "[[:digit:]]\{4\}"
私の問題は、2つの別々の出力がありますが、望む方法で組み合わせる方法がわからないということです。どんなアイデアがありますか?必要なことawk
ができると思います。
答え1
基本的なツールでは、テキスト処理が難しすぎると、アッ。
awk -F , '{last_name = $1; sub(/\).*/, ""); sub(/.*\(/, ""); print last_name, $0}'
sedはほぼ同じです。読みにくいですが、awkには逆参照がありません。
sed -n 's/^\([^,]*\),[^(]*(\([^()]*\)).*/\1 \2/p'
この特定のタスクの場合、通常Perlはより簡単です。 non-greedy 反復演算子を使用して、行*?
の最初の角かっこ部分をキャプチャすることができます。
perl -l -ne '/^([^,]*),.*?\(([^()]*)\)/ and print "$1 $2"'
答え2
あなたのコードスニペットをaloisというファイルに入れました。
sed -r 's/^([^ ,]+)[^0-9]+([0-9]+).*$/\1 \2/' alois
Aloise-Young 1993
Banerjee 2002
Bennett 1989
簡単な説明:sedの検索と置換機能を使用します。s/パターン/交換/
^([^ ,]+) は、行の先頭から空白や a 以外の項目をインポートして覚えていることを意味します。 (括弧はこの意味です。)
[^0-9]+ は数値ではなくすべてを検索しますが無視します。
([0-9] +)連続した数字を取得して記憶します。
.*$ は行末の他のすべての項目と一致します。
\ 1 \ 2一致するすべての項目(全体行)を上記の値に置き換えます。
答え3
通常、paste
コマンドの出力を手続き型置換に関連付けることができるので、<(...)
あなたの場合は次のように動作します。
paste -d ' ' <(cut -d, -f1 file) <(grep -o "[[:digit:]]\{4\}" file)
出力:
Aloise-Young 1993
Banerjee 2002
Bennett 1989
ただし、これを行うには2回渡す必要がありますが、file
これは不要であるため、2つのアイテムを一度にインポートできるツール(たとえば)を使用する必要がありsed
ますawk
。
答え4
セクシーではありませんが、最初のカンマから最初の開き括弧までテキストを切り取ることができます。すべてを空白に変更します。次に、最初の閉じ括弧から行末まで文字を切り取ります。
1. convert this => , ..... ( to a space
2. convert this => )........ to nothing
注文する
$ cat file | sed 's/,.*(/ /' | sed 's/).*//'
Aloise-Young 1993
Banerjee 2002
Bennett 1989