bash + 기존 경로를 기반으로 줄 끝에 경로를 추가하는 방법

bash + 기존 경로를 기반으로 줄 끝에 경로를 추가하는 방법

다음 구성 파일(실시예 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,/

예상 결과(예 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하위 명령 구분 기호 로 처리됩니다.
  • [^/]+- 슬래시를 제외한 하나 이상의 문자와 일치합니다./
  • ^ $- 각각 선의 시작점과 끝점입니다.

답변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

관련 정보