bash + 如何根据现有路径将路径附加到行尾

yae*_*ael 5 sed awk perl text-processing

以下配置文件(示例 1)未按应有的方式配置。

文件中的每一行都应包含/grid/sdX( ato 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,/
Run Code Online (Sandbox Code Playgroud)

预期结果(示例 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
Run Code Online (Sandbox Code Playgroud)

Rom*_*est 6

sed 解决方案:

sed -Ei 's~^(/[^/]+/[^/]+)(.*,)/$~\1\2\1~' dfs_data_dir_mount.hist
Run Code Online (Sandbox Code Playgroud)
  • ~- 作为sed子命令分隔符处理
  • [^/]+ - 匹配一个或多个字符(斜杠除外) /
  • ^ $ - 分别是行的开始和结束


jes*_*e_b 5

我能够使用以下 awk 命令完成此操作:

awk -F'/' '{OFS="/";}{print $1,$2,$3,$4,$5,$6,"grid",$3}' input
Run Code Online (Sandbox Code Playgroud)

awk

  • -F'/' - 分隔输入 /
  • {OFS="/";} - 分隔输出 /
  • {print $1,$2,$3,$4,$5,$6,"grid",$3}'- 打印/grid/sd*/hadoop/hdfs/data,/(从输入中获取的字段)和grid/sd*grid再次手动输入和添加字段 3)


hee*_*ayl 5

awk

awk -F/ -v OFS='/' '!$NF {$0=$0 $2 OFS $3}; 1'
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)