98

各セクションの後に区切り記号として1 つのファイルが-|あります... UNIX を使用してセクションごとに個別のファイルを作成する必要があります。

入力ファイルの例

wertretr
ewretrtret
1212132323
000232
-|
ereteertetet
232434234
erewesdfsfsfs
0234342343
-|
jdhg3875jdfsgfd
sjdhfdbfjds
347674657435
-|

ファイル 1 の期待される結果

wertretr
ewretrtret
1212132323
000232
-|

ファイル 2 の期待される結果

ereteertetet
232434234
erewesdfsfsfs
0234342343
-|

ファイル 3 で期待される結果

jdhg3875jdfsgfd
sjdhfdbfjds
347674657435
-|
4

11 に答える 11

105

ワンライナー、プログラミングなし。(正規表現などを除く)

csplit --digits=2  --quiet --prefix=outfile infile "/-|/+1" "{*}"

テスト済み: csplit (GNU coreutils) 8.30

Apple Mac での使用に関する注意事項

csplit「OS X ユーザーの場合、OS に付属の のバージョンは機能しないことに注意してくださいgcsplit。. — @ダニエル

「追加するには、OS X のバージョンを (少なくとも High Sierra で) 動作させることができます。引数を少し調整する必要があるだけですcsplit -k -f=outfile infile "/-\|/+1" "{3}"。動作しないように見える機能は、"{*}"具体的に説明する必要がありました。区切り記号の数であり-k、最後の区切り記号が見つからない場合にすべての出力ファイルを削除しないようにするために追加する必要がありました。また、必要な場合は、代わり--digitsに使用する必要があります-n。" — @ペブル

于 2012-07-03T16:07:14.033 に答える
43
awk '{f="file" NR; print $0 " -|"> f}' RS='-\\|'  input-file

説明(編集):

RSはレコード区切り文字であり、このソリューションでは、複数の文字を使用できるようにする gnu awk 拡張機能を使用しています。NRレコード番号です。

print ステートメント" -|"は、レコード番号を名前に含むファイルにレコードを出力します。

于 2012-07-03T16:04:39.550 に答える
7

Debian にはcsplitがありますが、それがすべて/ほとんど/他のディストリビューションに共通しているかどうかはわかりません。そうでない場合でも、ソースを追跡してコンパイルするのはそれほど難しくありません...

于 2012-07-03T15:42:42.810 に答える
5

ファイルには、次のテキストが移動する名前の行が含まれているという、わずかに異なる問題を解決しました。このperlコードは私のためにトリックを行います:

#!/path/to/perl -w

#comment the line below for UNIX systems
use Win32::Clipboard;

# Get command line flags

#print ($#ARGV, "\n");
if($#ARGV == 0) {
    print STDERR "usage: ncsplit.pl --mff -- filename.txt [...] \n\nNote that no space is allowed between the '--' and the related parameter.\n\nThe mff is found on a line followed by a filename.  All of the contents of filename.txt are written to that file until another mff is found.\n";
    exit;
}

# this package sets the ARGV count variable to -1;

use Getopt::Long;
my $mff = "";
GetOptions('mff' => \$mff);

# set a default $mff variable
if ($mff eq "") {$mff = "-#-"};
print ("using file switch=", $mff, "\n\n");

while($_ = shift @ARGV) {
    if(-f "$_") {
    push @filelist, $_;
    } 
}

# Could be more than one file name on the command line, 
# but this version throws away the subsequent ones.

$readfile = $filelist[0];

open SOURCEFILE, "<$readfile" or die "File not found...\n\n";
#print SOURCEFILE;

while (<SOURCEFILE>) {
  /^$mff (.*$)/o;
    $outname = $1;
#   print $outname;
#   print "right is: $1 \n";

if (/^$mff /) {

    open OUTFILE, ">$outname" ;
    print "opened $outname\n";
    }
    else {print OUTFILE "$_"};
  }
于 2012-12-01T00:27:02.377 に答える
4

次のコマンドは私にとってはうまくいきます。それが役に立てば幸い。

awk 'BEGIN{file = 0; filename = "output_" file ".txt"}
    /-|/ {getline; file ++; filename = "output_" file ".txt"}
    {print $0 > filename}' input
于 2017-02-07T19:40:56.473 に答える
3

awk も使用できます。私は awk にあまり詳しくありませんが、次のように動作するようでした。part1.txt、part2.txt、part3.txt、part4.txt が生成されました。これが生成する最後の partn.txt ファイルは空であることに注意してください。どのように修正するかはわかりませんが、少し調整するだけで解決できると確信しています。何か提案はありますか?

awk_pattern ファイル:

BEGIN{ fn = "part1.txt"; n = 1 }
{
   print > fn
   if (substr($0,1,2) == "-|") {
       close (fn)
       n++
       fn = "part" n ".txt"
   }
}

bash コマンド:

awk -f awk_pattern input.file

于 2012-07-03T16:00:01.680 に答える
1
cat file| ( I=0; echo -n "">file0; while read line; do echo $line >> file$I; if [ "$line" == '-|' ]; then I=$[I+1]; echo -n "" > file$I; fi; done )

およびフォーマットされたバージョン:

#!/bin/bash
cat FILE | (
  I=0;
  echo -n"">file0;
  while read line; 
  do
    echo $line >> file$I;
    if [ "$line" == '-|' ];
    then I=$[I+1];
      echo -n "" > file$I;
    fi;
  done;
)
于 2012-07-03T15:49:01.670 に答える
0

これは、そのことを行うperlコードです

#!/usr/bin/perl
open(FI,"file.txt") or die "Input file not found";
$cur=0;
open(FO,">res.$cur.txt") or die "Cannot open output file $cur";
while(<FI>)
{
    print FO $_;
    if(/^-\|/)
    {
        close(FO);
        $cur++;
        open(FO,">res.$cur.txt") or die "Cannot open output file $cur"
    }
}
close(FO);
于 2012-07-03T16:00:50.963 に答える
0

これは、私が context-split を書いたような問題です: http://stromberg.dnsalias.org/~strombrg/context-split.html

$ ./context-split -h
usage:
./context-split [-s separator] [-n name] [-z length]
        -s specifies what regex should separate output files
        -n specifies how output files are named (default: numeric
        -z specifies how long numbered filenames (if any) should be
        -i include line containing separator in output files
        operations are always performed on stdin
于 2012-07-03T17:17:59.197 に答える