2つのファイルがあります。ファイルには構造化データが含まれています。以下はその例です。
article 1 title
article 1 body line 1
article 1 body line 2
+++
article 2 title
article 2 body line 1
article 2 body line 2
article 2 body line 3
+++
article 3 title
article 3 body line 1
article 3 body line 2
+++
article 4 title
article 4 body line 1
article 4 body line 2
article 4 body line 3
ご覧のとおり、レコード+++
区切り記号です。各レコードの最初の行はタイトルであり、他のすべての行はそのレコードの内容です。他のファイルは、ヘッダーリストを含む単純なテキストファイルです。たとえば、
article 1 title
article 3 title
article 4 title
私が望むのは、2番目のファイルにリストされているタイトルのレコードです。したがって、前述の例の場合、予想される結果は次のとおりです。
article 1 title
article 1 body line 1
article 1 body line 2
+++
article 3 title
article 3 body line 1
article 3 body line 2
+++
article 4 title
article 4 body line 1
article 4 body line 2
article 4 body line 3
私の問題を解決することが可能かもしれないと思いますが、awk
方法がわかりません。
私が試したことは次のとおりです。
awk 'BEGIN{RS="(\r?\n)?\+{3}(\r?\n)?"; FS="\r?\n"; ORS="+++"} NR==FNR{a[$0];next} ...' title_list.txt data.txt
私の問題は、RS
2つのファイルが異なるはずですが、どのように機能させるのかわからないということです。
答え1
ファイルごとにRSなどの変数を個別に設定できます。たとえば、
$ awk 'NR==FNR{a[$0];next} $1 in a' RS='\r?\n' title_list.txt RS='+++\r?\n' FS='\r?\n' ORS='+++\n' data.txt
article 1 title
article 1 body line 1
article 1 body line 2
+++
article 3 title
article 3 body line 1
article 3 body line 2
+++
article 4 title
article 4 body line 1
article 4 body line 2
article 4 body line 3
+++
答え2
gawk
特殊ブロックを使用しBEGINFILE
て、ENDFILE
新しいファイルを読み取る前後に必要なルールを設定できます。たとえば、次のようになります。
$ awk 'NR==FNR{a[$0]++;next}ENDFILE{RS="+++\n";FS="\n"}a[$1]{printf $0RT}' title_list.txt data.txt
article 1 title
article 1 body line 1
article 1 body line 2
+++
article 3 title
article 3 body line 1
article 3 body line 2
+++
article 4 title
article 4 body line 1
article 4 body line 2
article 4 body line 3
答え3
これは、次のようにsedとawkの組み合わせを使用して行われます。
注文する
k=`awk '{print NR}' file2| sed -n '$p'`
for ((i=1;i<=$k;i++)); do j=`awk -v i="$i" 'NR==i{print $0}' file2`; sed -n "/$j/,/+++/p" file1; done
output
for ((i=1;i<=$k;i++)); do j=`awk -v i="$i" 'NR==i{print $0}' file2`; sed -n "/$j/,/+++/p" file1; done
article 1 title
article 1 body line 1
article 1 body line 2
+++
article 3 title
article 3 body line 1
article 3 body line 2
+++
article 4 title
article 4 body line 1
article 4 body line 2
article 4 body line 3