13

ファイルがあるとしましょう-a.csv

ram,33,professional,doc
shaym,23,salaried,eng

今、私はこの出力が必要です(plsは私に理由を尋ねないでください)

ram,doc,doc,
shayam,eng,eng,

カットコマンドを使用しています

cut -d',' -f1,4,4 a.csv

しかし、出力は残ります

ram,doc
shyam,eng

つまり、cutはフィールドを1回だけ印刷できます。同じフィールドを2回またはn回印刷する必要があります。 なぜこれが必要なのですか?(読むオプション)ああ。長い話だけれども。私はこのようなファイルを持っています

#,#,-,-
#,#,#,#,#,#,#,-
#,#,#,-

私はこれを隠さなければなりません

#,#,-,-,-,-,-
#,#,#,#,#,#,#,-
#,#,#,-,-,-,-

ここで、「#」と「-」はそれぞれ異なる数値データを参照しています。ありがとう。

4

5 に答える 5

11

同じフィールドを2回印刷することはできません。cut選択したフィールド(または文字またはバイト)を順番に出力します。1つのコマンドで2つの異なるカット出力を組み合わせるを参照してください。非常によく似たリクエストの場合は、cutコマンドを使用してフィールド/文字を並べ替えます。

CSVにフィールドの前後に引用符がない場合、ここで使用する適切なツールはawkです。

awk -F , -v OFS=, '{print $1, $4, $4}'

awkを使用したくない場合(なぜ?奇妙なシステムにはあるのcutsedないのawkですか?)、sedを使用できます(CSVにフィールドの前後に引用符がないことを前提としています)。最初の4つのコンマ区切りフィールドを一致させ、必要な順序で必要なフィールドを選択します。

sed -e 's/^\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/\1,\4,\4/'
于 2012-09-13T11:39:52.893 に答える
1
$ sed 's/,.*,/,/; s/\(,.*\)/\1\1,/' a.csv
ram,doc,doc,
shaym,eng,eng,

これは何をしますか:

  • 最初と最後のコンマの間のすべてをコンマだけに置き換えます
  • 最後の「、何か」の部分を繰り返し、コンマを付けます。Voilà!

行われた仮定:

  • 最初のフィールドが必要で、次に最後のフィールドの2倍が必要です
  • 最初と最後のフィールド内にエスケープされたコンマはありません

なぜこの出力が必要なのですか?:-)

于 2012-09-13T11:33:21.097 に答える
1

他の人が指摘しているように、cutフィールドの繰り返しをサポートしていません。

たとえば、繰り返される要素が最後にある場合は、をcut組み合わせることができます。sed

< a.csv cut -d, -f1,4 | sed 's/,[^,]*$/&&,/'

出力:

ram,doc,doc,
shaym,eng,eng,

編集

繰り返し変数を作成するには、次のようなことを行うことができます(coreutilsが利用可能であると仮定します)。

n=10
rep=$(seq $n | sed 's:.*:\&:' | tr -d '\n')
< a.csv cut -d, -f1,4 | sed 's/,[^,]*$/'"$rep"',/'

出力:

ram,doc,doc,doc,doc,doc,doc,doc,doc,doc,doc,
shaym,eng,eng,eng,eng,eng,eng,eng,eng,eng,eng,
于 2012-09-13T12:53:25.053 に答える
1

perlの使用:

perl -F, -ane 'chomp($F[3]);$a=$F[0].",".$F[3].",".$F[3];print $a."\n"' your_file

sedの使用:

sed 's/\([^,]*\),.*,\(.*\)/\1,\2,\2/g' your_file
于 2012-09-13T13:01:04.517 に答える
0

同じ問題が発生しましたが、すべての列をawkに追加する代わりに、(2番目の列を複製するために)使用しました:

awk -v OFS='\t' '$2=$2"\t"$2' # for tab-delimited files

CSVの場合は、

awk -F , -v OFS=, '$2=$2","$2'

于 2018-02-01T22:49:49.640 に答える