1

file1.csv次のような3つの列を持つカスタム形式のCSVファイルがあります。

This is some data. [text] This is some more data.
  • 最初の前のすべて[が最初の列にあります。
  • 角括弧の最初のセットの間のすべてが2番目の列にあります。
  • ]どんな内容が続くかに関係なく、最初以降はすべて3番目の列にあります。

例えば:

First. [second] Third.
      ^        ^

ファイルの行を2つのファイルに並べ替えたいと思います。基本的に、3番目の列に数字が含まれているファイルwithnumbers.csvwithoutnumbers.csv、3番目の列に数字が含まれていないファイルで並べ替えます。

後で角かっこが表示される場合がありますが、それらは新しい列とは見なされず、3番目の列のデータの一部です。例:

First. [second] Third. [some more text] This is still in the third column.
      ^        ^

数字を含む行は、、、などのよう*0*に一致させることができます。これらはすべて数字を含みます。*1**2*

Water is H20.
The bear ate 2,120 fish.
The Wright Flyer flew in 1903.

3番目の列の角括弧のペア内のどこかにある番号は、一致としてカウントされません。たとえば、これらの行は次の宛先に送信されwithoutnumbers.csvます。

First. [second] Some text. [This has the number 1.]
First. [second] Some more text. [The Wright Flyer flew in 1903.]

withnumbers.csvこれらは、角かっこの外側で3番目の列の内側にまだ番号があるため、に送信されます。

First. [second] Some text with 1. [This has the number 1.]
First. [second] Some more text with the number 3. [The Wright Flyer flew in 1903.]

角かっこ内にある数字と数字を含まない行を考慮せずに、ファイルの行を3番目の列に数字を含む行に並べ替えるにはどうすればよいですか?

4

3 に答える 3

3

まあ、私はうそをつくつもりはありません、私は私が思いついた解決策を愛していません。しかし、あなたの問題はかなり独特であり、絶望的な時代には絶望的な対策が必要です。だから、これを試してみてください:

awk -F'\[[^\]]*\]' '{
  printed = 0
  for (i = 2; i <= NF; i++) {
    if ($i ~ /[0-9]+/) {
      print $0 >> "withNumbers"
      printed = 1
      break
    }
  }

  if (! printed) {
    print $0 >> "withoutNumbers"
  }
}' file
于 2012-05-15T01:34:39.607 に答える
1

さあ、行ってみよう

shopt -s extglob
rm withnumbers.csv withoutnumbers.csv
touch withnumbers.csv withoutnumbers.csv

while IFS= read -r line; do
  col3=${line#*\]}            # remove everything before and including the first ]
  col3=${col3//\[*([^]])\]/}  # remove all bracketed items
  if [[ $col3 == *[[:digit:]]* ]]; then
    printf "%s\n" "$line" >> withnumbers.csv
  else
    printf "%s\n" "$line" >> withoutnumbers.csv
   fi
done < file1.csv
于 2012-05-15T02:10:07.130 に答える
1

これは、最初の閉じ角括弧で分割し、最初の閉じ角括弧の後の行の部分で角括弧内の数字をチェックするか、その部分が非数字のみで構成されているかどうかをチェックします。これらの行を withoutnumbers.csv に書き込みます。それ以外の場合は、行を withnumbers.csv に書き込みます。

perl -lne 'BEGIN {open ND, ">", withoutnumbers.csv; open D, ">", withnumbers.csv} @fields = split(/]/,$_,2); $fields[1] =~ /\[.*?\d.*?\]|^\D+$/ ? print ND $_ : print D $_' file1.csv
于 2012-05-15T05:58:14.467 に答える