텍스트 파일의 첫 번째 열을 6에서 현재 값을 뺀 값으로 바꿉니다.

텍스트 파일의 첫 번째 열을 6에서 현재 값을 뺀 값으로 바꿉니다.

공백으로 구분된 다음 파일이 있습니다.

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로 가져옵니다.awkkmax
  • 프로그램은 $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

https://raku.org

관련 정보