아래 샘플이 있습니다
a12,b12122,c12,d12
a13,887988,c13,d13
a14,b14121,c79,d13
난 단지 변경하려면 79 에 HH를 열이 올 경우에만 가능합니다.
내가 할 때
awk -F, '$2~"79"' myfile | sed 's/79/hh/g' > temp && mv temp myfile
그것은 나에게 두 번째 줄과 첫 번째와 세 번째가 사라졌습니다.
그것은 단지에만 교체 그래서, 그래서 난 내 코드에서 무엇을 교체해야 79 값에 887,988 에 HH
다른 포럼에서 아래 코드와 같이 할 수 있지만 코드 오류가 발생한 것 같습니다.
$ awk '{gsub("79","hh",$2)}1' myfile
a12,b112122,c12,d12
a13,887988,c13,d13
a14,b14121,c79,d13
[편집] 아래 작업 덕분에
awk -F, 'BEGIN { OFS = FS } $2 ~ /79/ { sub(/79/, "hh", $2) }1' file
하지만 새 샘플에서 쉼표를 제거하려고 할 때
내 샘플은
cat > myfile
"a12","b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13
내가 열 2에서 " 를 제거하려고 할 때
awk -F, 'BEGIN { OFS = FS } $2 ~ /"/ { sub(/"/, "", $2) }1' myfile
"a12",b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13
그것은 단지 대신에, 단지 1 쉼표를 제거 b112122 내가 얻고있다 "b112122을
내가 뭘 잘못하고 있니?
내 코드의 파트 2가 있습니다.
열 2 에서만 b1 로 시작 하고 길이가 6 이어야 하는 grep을 어떻게 할 수 있습니까?
만약 내가한다면
cat myfile | grep -x '.\{6\}' | grep "^[b1]"
그것은 나에게 빈 결과를 준다.
b1로 시작하고 길이가 6 인 경우에만 awk (예 : $ 2 ~ / b1 / )는 무엇입니까 ?
포함하는 행 요소를 식별하고 79
이를 사용하여 교체를 수행 하기 위해 부품을 결합해야합니다.sub()
awk -F, 'BEGIN { OFS = FS } $2 ~ /79/ { sub(/79/, "hh", $2) }1' file
시도의 문제 sed
는 첫 awk
번째 행이 대체 및 리디렉션시 하나의 행만있는 새 파일을 생성하는 두 번째 행만 필터링한다는 것입니다.
위에서 내가 가진 것은 $2
as를 포함하는 행에서만 조건부 대체를 79
수행하고 대체를 수행합니다. 일치하지 않는 다른 행의 경우 기본 인쇄가 수행되어 행 {..}1
을 인쇄합니다.
최적의 방법을 찾고 있다면 아래와 같이 대체를 수행하기 전에 중복 검사를 피할 수 있습니다. sub()
는 패턴을 포함하지 않는 행에 대한 조치를 무시 하기 때문 입니다.이 경우 행은 단순히 인쇄됩니다.
awk -F, 'BEGIN { OFS = FS } sub(/79/, "hh", $2) 1' file
b1
6으로 시작 하고 길이에 대한 추가 질문에 대해 다음을 수행해야합니다.
awk -F, 'BEGIN { OFS = FS } $2 ~/^b1/ && length($2) == 6' file
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다