
以下の条件で入力ファイルを変更するには、SEDコマンドを生成する必要があります。
以下の入力ファイルがあります。
アイテム一覧
Rad# ; ID_KEY ; UNIT_ID
1 ; 30000000004 ; 8417920
2 ; 30000000004 ; 8170811
︙
10 ; 30000000004 ; 1581292
︙
1001 ; 3000000000 ; 8285052
このファイルで実行する必要がある作業は次のとおりです。
- 最初の行を完全に削除します。
- 2番目と3番目の数値セットのみをカンマで区切ってください。
,DATABASE
各行の末尾に文字列を追加します。
出力は以下のようになります。
アイテム一覧
30000000004,8417920,DATABASE
30000000004,8170811,DATABASE
答え1
質問の出力が目的の出力であると仮定すると、これを試すことができます。
awk -F';' 'BEGIN{OFS=",";} NR>1{gsub(/ /,""); print $2,$3,"DATABASES"}' filename | sed -e :a -e '$!N;s/\n/,/;ta'
たぶんそれが唯一の方法かもしれませんawk
。sed
行を同じ行に配置するには、そのセクションを削除してください。
SEは教育的な目的を持っているようですので、上記のコマンドで各フラグの役割を説明します。
-F';'
;
#次に使用する--field-separator
BEGIN {OFS=",";}
#これは後続のコマンドの前に実行される特殊モードであり、その出力はプログラムの残りの部分に影響されません。だから私たちはORS
ORS
#出力にはカンマを含める必要があるため、コンマを値として,
定義します。Output Record Separator
デフォルトORS
は改行です。"\n"
NR>1
#ここでは、最初のレコードをスキップしたと言います。NR
合計入力レコード数を格納するために使用される特別な予約変数でもあります。
gsub()
#はいくつかのパラメータを受け入れる関数です。たとえば$2
、フィールドが指定されていない場合、$3
thengsub()
関数はレコード全体を使用します。$0
最後に指定されたフィールドが印刷され、行の末尾に追加print $2,$3,"DATABASE"
されます。DATABASE
print $2,$3
#ここでは、カンマを使用してフィールドを区切ります。デフォルトの区切りFS (Field separator)
文字は単一のスペースです' '
。
この簡単な説明で、いくつかのことが明確になったことを願っています。
答え2
私は、(質問の最初のバージョンのように、すべて1行にまとめて実行されるのではなく)、ヘッダーの後の各入力行を出力行に変換したいとします。
sed
仕事に非常に良いツールとして使用することができます。
sed -e 1d -e "s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/"ファイル名
どこ
1d
最初の行を削除することを意味し、-
s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/
つまり、最初の行以降の各行を分離し、除外されるその部分の末尾のスペースに置き換えます。
something1 ; something2 ; something3
something2,something3,DATABASE
.*[^ ]
something3
答え3
コメントのように、awkソリューションは次のとおりです。
awk '{ FS=";"; OFS=","; gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); gsub(/^[ \t]+/, "", $3); gsub(/[ \t]+$/, "", $3); } NR > 1 { print $2, $3, "DATABASE" }' file
答え4
私はこれを行うことができます:
cut -d' ' -f3,5 <infile |
sed -n 'y/ /,/;1!s/$/,DATABASE/p'
...私はこれがおそらくこの問題に対する最も効率的な解決策だと思うからです。