파일의 모든 줄에있는 특정 필드에서만 긴 접두사를 제거 하시겠습니까?
다음 줄 (공백으로 구분 된 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
어떻게해야할지 모르겠습니다.
답변
첫 번째 해결책 : 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.
나는 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에서 테스트 됨)
awk를 사용한 솔루션 :
awk '{ split($2,s,"/"); $2=s[length(s)]; print }' inputfile
는 split($2,s,"/")
어레이에 상기 제 varable 분할 할
$2=s[length(s)];
두 번째 변수에 배열의 마지막 값을 할당합니다.
print
완성 된 줄을 인쇄합니다.
awk '{ split($2,map,"/");$2=map[length(map)] }1' file
awk 사용. 구분 기호로 /를 사용하여 두 번째 공백으로 구분 된 필드를 map이라는 배열로 분할합니다. $ 2를 맵 배열의 마지막 요소로 대체하십시오. 속기 1로 줄을 인쇄합니다.
sed 사용 :
sed -rn 's/(^.*)([[:space:]])(.*\/)?(.*)([[:space:]])(.*$)/\1 \4 \6/p' file
정규식에 따라 각 줄을 섹션으로 나누고 관련 섹션을 해당 줄로 대체하여 결과를 인쇄합니다.
사용 sed
:
sed -E 's/^([^ ]* )([^/]*\/)*/\1/' infile
또한 이것은 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