홈>
입력 파일은 다음과 같습니다 :
1 0 0 000 3444
2 3 3 456 6875
3 0 0 023 3300
4 2 2 211 1000
먼저 : 각 줄의 사본 2 개를 갖고 싶습니다 :
1 0 0 000 3444
1 0 0 000 3444
2 3 3 456 6875
2 3 3 456 6875
3 0 0 023 3300
3 0 0 023 3300
4 2 2 211 1000
4 2 2 211 1000
두 번째 : 각 줄의 첫 번째 사본에서 3은 2로 대체되어야하고 4는 1로 대체되어야하고 각 줄의 두 번째 사본에서는 3은 1로 대체되어야하고 4는 2로 대체되어야합니다 (첫 번째 열 행 이름과 행 번호는 변경하지 않아야합니다). 따라서 최종 출력은 다음과 같습니다.
1 0 0 000 2111
1 0 0 000 1222
2 2 2 156 6875
2 1 1 256 6875
3 0 0 022 2200
3 0 0 021 1100
4 2 2 211 1000
4 2 2 211 1000
제안이 있으십니까? 시도했지만 작동하지 않습니다.
awk '
{ tmp = $2; gsub("3", "2", $2); gsub("4", "1", $2); print}
{ $2 = tmp; gsub("3", "1", $2); gsub("4", "2", $2); print}
' < input > output
- 답변 # 1
- 답변 # 2
펄은
tr
가 내장되어 있기 때문에 이런 종류의 것에는 아주 좋은 것 같습니다$ perl -alne ' @tmp=@F; tr/34/21/ for @tmp[1..4]; print join " ", @tmp; tr/34/12/ for @F[1..4]; print join " ", @F ' file 1 0 0 000 2111 1 0 0 000 1222 2 2 2 156 6875 2 1 1 256 6875 3 0 0 022 2200 3 0 0 021 1100 4 2 2 211 1000 4 2 2 211 1000
- 답변 # 3
정말 우아하지는 않지만 GNU
sed
에서 가능합니다 :h # save in hold s_^[0-9]\{1,\} __ # remove first column s_3_A_g # change 3 and 4 to A and B s_4_B_g x # swap with hold s_ .*$__ # remove everything but first column G # append from hold s_\n_ _ # join lines (with space) h # save in hold space again s_A_2_g # first output -> 2, 1 s_B_1_g p # print first line g # restore from hold s_A_1_g # second output -> 1, 2 s_B_2_g # end of script, second line printed automatically
이것은 첫 번째 열을 저장하고 (변경되지 않음) 나머지 3과 4가 각각 As와 B로 변경된 라인의 버전을 만듭니다. 그런 다음이 라인은 두 출력 모두에 사용되며 먼저
2
를 사용합니다. 그리고1
그런 다음 다른 방향으로 돌아갑니다.sed -f script.sed input > output
이것은 입력에 숫자와 공백 만 포함한다고 가정합니다. 와이즈 비즈 그리고
A
아직 나타나지 않습니다.B
관련 자료
- ios - 뷰 내에서 CGFloat의 값을 변경할 수 없습니다
- regex - 큰 따옴표 내에서만 한 단어를 일치시키는 방법
- linux - 왜 작은 따옴표와 큰 따옴표가"bash -c"에서 다르게 작동합니까?
- R Shiny 앱의 서버 기능 내에서 easyButton 상태 변경
- javascript - Vue는 드롭 다운 업데이트 내에서 여러 바인딩 변경을 감시합니다
- spring - Manifestmf 내에서 Main-Class 속성을 변경할 수 없습니다
- arrays - [Double]에서 부호 변경 전후의 번호 검색
- Ubuntu WSL 내에서 Windows 형식으로 디렉터리를 변경하는 방법은 무엇입니까?
- javascript - 순서 변경에 3 차 연산자가 포함 된 경우 논리 OR이 다르게 작동하는 이유
- java - 이중 형식 변경 - 쉼표로 점
- angularjs - 컨트롤러 범위 내에서 변경 이벤트를 호출하는 방법은 무엇입니까?
- Python JSON은 작은 따옴표를 큰 따옴표로 변경하여 문자열 내 따옴표 만 남겨 둡니다
- html - 목록 내 한 이미지의 이미지 크기 변경
관련 질문
- arrays : 아마 배열을 사용하여 AWK의 어려운 패턴에서 두 개의 열을 배치하여 계산
- linux - 시퀀스가있는 두 파일 세트에서 N 개의 동일한 연속 문자 비교
- text processing - 파일에서 (하나 또는) 두 개의 다른 패턴을 regexp로 바꿉니다
- awk - 다중 열 로그 파일의 사후 처리
- text processing - awk 질문 - 고유 한 날짜에 대해서만 추가 라인을 인쇄하는 방법
- text processing - \ n + ">"및 숫자 헤더를 추가하여 200 자마다 줄을 구분하려면 어떻게해야합니까?
- AWK를 사용하여 YAML 블록을 추출하는 방법
- text processing - 빈 줄을 위 줄 내용으로 교체
- linux - 하위 구분자로 첫 번째 열 수정
- text processing - sed 또는 awk 등으로 줄 바꿈을 "조건부로"제거하는 방법은 무엇입니까?
각 줄을 두 배로 늘리는 방법 : 여기를 참조하십시오 ...
두 번째 요청과 관련하여 첫 번째 필드와 전체 행을 변수에 저장 한 다음 첫 번째 변경을 수행하고 첫 번째 필드를 초기 값으로 설정하고 인쇄 한 다음 줄 내용을 복원하고 두 번째 변경을 수행하고 첫 번째 필드를 다시 설정하십시오 초기 값 및 인쇄 :