공백으로 구분된 다음 파일이 있습니다.
2.5 235215 3.1925
3.7 125255 1.3125
첫 번째 열을 6에서 현재 값을 뺀 값으로 변경해야 합니다. 원하는 결과는 다음과 같습니다.
3.5 235215 3.1925
2.3 125255 1.3125
Bash 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있나요?
나는 노력했다
$KMAX=6
sed -E "s/^(([^ ]+ +){3})$1 /\1$KMAX-$1 /" $1
답변1
이 작업은 다음을 사용하여 쉽게 해결할 수 있습니다 awk
.
awk -v kmax=6 '{$1=kmax-$1}1' file.txt
- 이렇게 하면 값을 내부적으로 사용할 수 있는 변수
6
로 가져옵니다.awk
kmax
- 프로그램은
$1
첫 번째 열을 산술 결과로 대체 합니다kmax-$1
. 1
액션 블록 외부의 겉보기에 "길 잃은" 결과는 모든 수정 사항을 포함하여 현재 줄을 인쇄하는 것입니다.
참고: 공백으로 구분된 열의 경우 awk
에만하나공백은 출력에서 구분 기호 역할을 하므로 결과는 다음과 같습니다.
3.5 235215 3.1925
2.3 125255 1.3125
답변2
사용행복하다(이전 Perl_6)
~$ raku -ne 'given .split( / \s+ /) { put join "\t", (6 - .[0], .[1..*]) };'
또는:
~$ raku -ne 'given .split( / \s+ /) { join("\t", (6 - .[0], .[1..*])).put };'
Raku는 Perl 프로그래밍 언어 제품군입니다. Raku를 사용하면 한 줄의 코드를 쉽게 처리할 수 있다는 장점이 있으며, 더 심각한 CSV 처리가 필요한 경우 모듈(예: Text::CSV
)을 사용할 수 있습니다.
위의 코드는 -ne
비자동 인쇄, 한 줄씩 플래그를 사용하여 호출됩니다. 이 given
키워드는 Raku에게 공백을 사용하여 입력을 하나의 항목(한 줄)으로 처리하도록 지시합니다 split
. 블록 내에서 첫 번째 요소에서 6을 빼고 .[0]
그 결과를 .[1..*]
나머지 요소와 함께 목록에 넣습니다. 마지막으로 출력을 인쇄합니다 put
.
입력 예:
2.5 235215 3.1925
3.7 125255 1.3125
예제 출력:
3.5 235215 3.1925
2.3 125255 1.3125