次の設定ファイル(実施例1) が期待どおりに構成されていません。
ファイルの各行には、の説明に従って/grid/sdX
(a
to z
)を含める必要があります。実施例2。
これを行うには、bashスクリプトを書く方法を見つける必要があります。/grid/sdX
行の末尾に欠けているコンテンツを追加するには?
実施例1
more dfs_data_dir_mount.hist
/grid/sdk/hadoop/hdfs/data,/
/grid/sdi/hadoop/hdfs/data,/
/grid/sdh/hadoop/hdfs/data,/
/grid/sdc/hadoop/hdfs/data,/grid/sdc
/grid/sdj/hadoop/hdfs/data,/
/grid/sde/hadoop/hdfs/data,/grid/sde
/grid/sdd/hadoop/hdfs/data,/grid/sdd
/grid/sdb/hadoop/hdfs/data,/grid/sdb
/grid/sdf/hadoop/hdfs/data,/grid/sdf
/grid/sdg/hadoop/hdfs/data,/
予想結果(例2)
/grid/sdk/hadoop/hdfs/data,/grid/sdk
/grid/sdi/hadoop/hdfs/data,/grid/sdi
/grid/sdh/hadoop/hdfs/data,/grid/sdh
/grid/sdc/hadoop/hdfs/data,/grid/sdc
/grid/sdj/hadoop/hdfs/data,/grid/sdj
/grid/sde/hadoop/hdfs/data,/grid/sde
/grid/sdd/hadoop/hdfs/data,/grid/sdd
/grid/sdb/hadoop/hdfs/data,/grid/sdb
/grid/sdf/hadoop/hdfs/data,/grid/sdf
/grid/sdg/hadoop/hdfs/data,/grid/sdg
答え1
sed
解決策:
sed -Ei 's~^(/[^/]+/[^/]+)(.*,)/$~\1\2\1~' dfs_data_dir_mount.hist
~
-sed
サブコマンド区切り文字として扱われます。[^/]+
- スラッシュを除く1つ以上の文字と一致します。/
^
$
- それぞれ線の始点と終点です。
答え2
次のawkコマンドを使用してこれを実行できます。
awk -F'/' '{OFS="/";}{print $1,$2,$3,$4,$5,$6,"grid",$3}' input
awk
-F'/'
- 別途入力/
{OFS="/";}
- 別途出力/
{print $1,$2,$3,$4,$5,$6,"grid",$3}'
- 印刷/grid/sd*/hadoop/hdfs/data,/
(入力から取得したフィールド)とgrid/sd*
(grid
フィールド3を手動で入力して再度追加)
答え3
awk
:
awk -F/ -v OFS='/' '!$NF {$0=$0 $2 OFS $3}; 1'
-F/ -v OFS='/'
入力フィールドと出力フィールドの区切り文字を次に設定します。/
!$NF {$0=$0 $2 OFS $3}; 1
最後のフィールドが空の場合は、必要な形式でレコードを再作成します。1
オリジナルでなけれawk
ばならず、印刷された記録でなければなりません。
例:
% cat file.txt
/grid/sdk/hadoop/hdfs/data,/
/grid/sdi/hadoop/hdfs/data,/
/grid/sdh/hadoop/hdfs/data,/
/grid/sdc/hadoop/hdfs/data,/grid/sdc
/grid/sdj/hadoop/hdfs/data,/
/grid/sde/hadoop/hdfs/data,/grid/sde
/grid/sdd/hadoop/hdfs/data,/grid/sdd
/grid/sdb/hadoop/hdfs/data,/grid/sdb
/grid/sdf/hadoop/hdfs/data,/grid/sdf
/grid/sdg/hadoop/hdfs/data,/
% awk -F/ -v OFS='/' '!$NF {$0=$0 $2 OFS $3}; 1' file.txt
/grid/sdk/hadoop/hdfs/data,/grid/sdk
/grid/sdi/hadoop/hdfs/data,/grid/sdi
/grid/sdh/hadoop/hdfs/data,/grid/sdh
/grid/sdc/hadoop/hdfs/data,/grid/sdc
/grid/sdj/hadoop/hdfs/data,/grid/sdj
/grid/sde/hadoop/hdfs/data,/grid/sde
/grid/sdd/hadoop/hdfs/data,/grid/sdd
/grid/sdb/hadoop/hdfs/data,/grid/sdb
/grid/sdf/hadoop/hdfs/data,/grid/sdf
/grid/sdg/hadoop/hdfs/data,/grid/sdg
答え4
文字列連結演算子を使用する代替(フィールドベース)Perlアプローチ.=
:
perl -F/ -lpe '$_ .= "$F[1]/$F[2]" unless defined $F[7]' dfs_data_dir_mount.hist