web-dev-qa-db-ja.com

セパレーター間でテキストを複数のファイルに分割する方法は?

次の内容を含むテキストファイルがあります。

"random
textA"
"random
random
textB"

区切り文字は"

次のようにbashコマンドを使用して、包含を複数のファイルに分割するにはどうすればよいですか?

ファイル1:

random
textA

ファイル2:

random
random
textB

csplitまたはawkを使用した例を思いつきましたが、このテキストレイアウトはカバーされていません。

7
Fabio

単純なawkコマンド:

awk 'NR%2==0{ print > "File "++i }' RS='"' file

RS"をレコード区切り記号として定義し、NRはレコード番号です。レコード番号が2のモジュロだった場合(レコードの最初の"があるため)、現在のレコード$0File #に出力します。

5
αғsнιη

開始引用符が常に行の先頭にある場合、csplitは次のようにうまく機能します。

bash$ csplit /tmp/data '/^"/'

これにより、xx00などのファイルが生成されます。例では、引用符が削除されていますが、これは削除されません。これを行うには、sedコマンドラインが必要です。

bash$ for file in xx* ; do { sed 's/^"//;s/"$//;' ${file} >x${file}; } ; done
4
nash e.f.

GNU awk

awk -v RS='"[[:space:]]*"' '
{sub(/^"|"[[:space:]]*$/, "");print > "output." ++n; close("output." n)}' file.txt
3
iruvar

できるよ:

awk -v RS=\" -v ORS= \
  '{ sub(/^\n*/,"");sub(/\n*$/,""); };
  /^\n*$/ { next;};
  { if(strcnt==0) { print $0 >"file1"; strcnt++;} else
  { print $0 >"file2"; }; }' file
2
Hauke Laging