行のすべての値をN / Aに変更する方法を学びたいと思います。例えば。すべての列で、行77 132 140 142 155 156 157と175をN / Aに置き換える必要があります。たとえば、
RS,RPHG,LPHG,RITC
13.7801604545457,3.10785528409178,-38.443658181819,-8.25890473295385
-12.5663095454547,-33.8395547159089,-3.44606818181819,-24.8157817329538
35.1140204545463,-35.4853647159089,-33.8231881818192,26.6855902670459
-29.9357495454533,-34.5783047159075,-50.3323381818191,2.0808182670462
答え1
$ awk -F, -vOFS=, 'FNR==2 || FNR==4 { for (i=1;i<=NF;++i) $i="N/A" } 1' file
RS,RPHG,LPHG,RITC
N/A,N/A,N/A,N/A
-12.5663095454547,-33.8395547159089,-3.44606818181819,-24.8157817329538
N/A,N/A,N/A,N/A
-29.9357495454533,-34.5783047159075,-50.3323381818191,2.0808182670462
FNR
現在のファイル内の現在のレコードのシリアル番号(「現在のファイルの行番号」)。 2つまたは4つの場合は、すべてのフィールド(1からNF
フィールド数まで)を繰り返し、各フィールドを文字列に設定しますN/A
。1
最後の末尾は、{ print }
すべての行(変更または変更されていない)が印刷されるようにする短い書き込み方法です。
削除する必要があるすべての行番号(1行につき1つの番号)を含む添付ファイルがある場合:
awk -F, -vOFS=, 'FNR==NR { a[$1]; next }
FNR in a { for (i=1;i<=NF;++i) $i="N/A" } 1' lines file
lines
行番号を持つファイルはどこにありますか?
ここでFNR==NR
私たちが読んでいるなら最初文書(lines
文書)。この場合、行番号を入力して配列に項目を作成し、a
次の行に進みます。NR
~であるみんなFNR
これまでに読み込んだ行数は、2番目のファイルから読み込みを開始する前の行数と同じです。
FNR
そうでなければ私たちNR
は読んでいます。第二ファイル(file
データを含むファイル)。次に、現在の行番号が配列のキーであるかどうかをテストしa
、そうであれば、前のようにすべてのフィールドを置き換えますN/A
。
答え2
1つの方法は次のとおりですsed
。
sed '
77c\
N/A,N/A,N/A,N/A
132c\
N/A,N/A,N/A,N/A
140c\
N/A,N/A,N/A,N/A
142c\
N/A,N/A,N/A,N/A
155c\
N/A,N/A,N/A,N/A
156c\
N/A,N/A,N/A,N/A
157c\
N/A,N/A,N/A,N/A
175c\
N/A,N/A,N/A,N/A
' input.csv
答え3
2行のフィルタリングを使用してawk
実証します。
awk 'BEGIN { FS=","; OFS="," } { if( NR == 77 || NR == 132 ) {for( i=1; i<=NF; i++) {$NF="N/A"} }; print }' input
if
関連するすべての行に対して、ステートメントにさらにオプションを追加するだけです。
答え4
使用awk
:
awk -vOFS=, '{
if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
$1=$2=$3=$4="N/A"
print
}' input.csv
出力で新しいファイルを生成するには、シェルリダイレクト>
演算子を使用します。
awk -vOFS=, '{
if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
$1=$2=$3=$4="N/A"
print
}' input.csv > newfile.csv