파일의 모든 줄에있는 특정 필드에서만 긴 접두사를 제거 하시겠습니까?

Nov 21 2020

다음 줄 (공백으로 구분 된 3 개의 필드)이 포함 된 파일이 있습니다.

component1 /dev/user/test 12344
component2 master abcefa123
component3 trunk 72812
component4 /branch/user/integration bc89fa
component5 trunk 989091 
component6 integration/test bc7829ac
component7 /branch/dev/user/various eded34512

필드 2를 조작하여 긴 접두사 ($ {string ## *}를 사용하여 bash에서 수행하는 것과 동일)를 잘라 내고 다음 결과를 얻어야합니다.

component1 test 12344
component2 master abcefa123
component3 trunk 72812
component4 integration bc89fa
component5 trunk 989091 
component6 test bc7829ac
component7 various eded34512

어떻게해야할지 모르겠습니다.

답변

2 RavinderSingh13 Nov 21 2020 at 12:27

첫 번째 해결책 : GNU에 표시된 샘플로 다음과 같이 작성하고 테스트 해 보시기 바랍니다awk.

awk '{num=split($2,arr,"/");$2=arr[num]} 1' Input_file

두 번째 솔루션 : 또는 표시된 샘플을 사용하여 필드 구분 기호를 공백 또는/.

awk -F'[ /]' '{print $1,$(NF-1),$NF}' Input_file

세 번째 솔루션 (사용 sed) : 사용하여sed다음과 같이 시도 할 수 있습니다.

sed 's/\([^ ]*\).*\/\(.*\)/\1 \2/' Input_file

설명 (1 차 솔루션) : 위에 대한 자세한 설명을 추가합니다.

awk '                   ##Starting awk program from here.
{
  num=split($2,arr,"/") ##Splitting 2nd field into array arr with / as field separator.
                        ##num is number of total elements of array arr.
  $2=arr[num]           ##Assigning last element of arr with index of num into 2nd field.
}
1                       ##Mentioning 1 will print the current line.
' Input_file            ##mentioning Input_file name here.
2 Daweo Nov 21 2020 at 12:57

나는 AWK다음과 같은 방식으로 사용할 file.txt것입니다.

component1 /dev/user/test 12344
component2 master abcefa123
component3 trunk 72812
component4 /branch/user/integration bc89fa
component5 trunk 989091 
component6 integration/test bc7829ac
component7 /branch/dev/user/various eded34512

그때

awk '{sub(/^.*\//, "", $2);print}' file.txt

출력 :

component1 test 12344
component2 master abcefa123
component3 trunk 72812
component4 integration bc89fa
component5 trunk 989091 
component6 test bc7829ac
component7 various eded34512

설명 관심 열의 처음부터 끝까지 /(따라서 이스케이프해야 함) 모든 것을 \빈 문자열로 바꾼 다음 print이 를 대체 합니다.

(GNU Awk 5.0.1에서 테스트 됨)

Luuk Nov 21 2020 at 12:27

awk를 사용한 솔루션 :

awk '{ split($2,s,"/"); $2=s[length(s)]; print }' inputfile

split($2,s,"/")어레이에 상기 제 varable 분할 할

$2=s[length(s)]; 두 번째 변수에 배열의 마지막 값을 할당합니다.

print 완성 된 줄을 인쇄합니다.

RamanSailopal Nov 21 2020 at 12:27
awk '{ split($2,map,"/");$2=map[length(map)] }1' file

awk 사용. 구분 기호로 /를 사용하여 두 번째 공백으로 구분 된 필드를 map이라는 배열로 분할합니다. $ 2를 맵 배열의 마지막 요소로 대체하십시오. 속기 1로 줄을 인쇄합니다.

RamanSailopal Nov 21 2020 at 12:43

sed 사용 :

sed -rn 's/(^.*)([[:space:]])(.*\/)?(.*)([[:space:]])(.*$)/\1 \4 \6/p' file

정규식에 따라 각 줄을 섹션으로 나누고 관련 섹션을 해당 줄로 대체하여 결과를 인쇄합니다.

αғsнιη Nov 21 2020 at 13:03

사용 sed:

sed -E 's/^([^ ]* )([^/]*\/)*/\1/' infile
CarlosPascual Nov 22 2020 at 10:08

또한 이것은 awk루프를 사용합니다 while.

awk '{while ( n=split($2,a,/\//) ) {$2=a[n];print;next}}' file
component1 test 12344
component2 master abcefa123
component3 trunk 72812
component4 integration bc89fa
component5 trunk 989091
component6 test bc7829ac
component7 various eded34512