가능한 값을 대체의 세포 csv 파일에서 사용 grep,sed 또는 모

0

질문

내가 쓴 다음과 같은 명령

#!/bin/bash
awk -v value=$newvalue -v row=$rownum -v col=1 'BEGIN{FS=OFS=","} NR==row {$col=value}1' "${file}".csv >> temp.csv && mv temp.csv "${file}".csv

샘플의 입력 파일입니다.csv

Header,1
Field1,Field2,Field3
1,ABC,4567
2,XYZ,7890

Assuiming $newvalue=3,$rownum=4 col=1,위의 코드를 대체:

필요한 출력

Header,1
Field1,Field2,Field3
1,ABC,4567
3,XYZ,7890

그렇다면 나는 알고 행과 열의,그것은 교체하는 것이 가능하다고 말했를 사용하여 값을 grep,sed?

Edit1:필드 3 은 항상 독특한 값을 위해 그들의 각각의 행이 있습니다. (경우에는 정보는 데 도움이 어쨌든)

bash csv git-bash linux
2021-11-24 06:52:47
3

최고의 응답

1

가정 CSV 파일로 간단 당신이 무엇을 표시(아이에 쉼표를 인용 필드)및 newvalue 을 포함하지 않는 문자 sed 해석에서는 특별한 방법으로(예를 들어 앰퍼샌드,슬래쉬 또는 백슬래쉬),다음과 같은 작업을해야만 sed(스 테스트 GNU sed):

sed -Ei "$rownum s/[^,]*/$newvalue/$col" file.csv

Demo:

$ cat file.csv
Header,1
Field1,Field2,Field3
1,ABC,4567
3,XYZ,7890
$ rownum=3
$ col=2
$ newvalue="NEW"
$ sed -Ei "$rownum s/[^,]*/$newvalue/$col" file.csv
$ cat file.csv
Header,1
Field1,Field2,Field3
1,NEW,4567
3,XYZ,7890

설명: $rownum 로 사용되는 주소로(여기에 줄 번호)를 적용하려면 다음 명령입니다. s 은 sed 대체 명령입니다. [^,]* 은 일반현을 검색과 대체:가능한 가장 긴 문자열을 포함하지 않는 쉼표로 구분합니다. $newvalue 교체 문자열입니다. $col 가 발생합니다.

는 경우 newvalue 이 포함될 수 있습 앰퍼샌드,슬래쉬 또는 백슬래쉬가 우리가 해야 살균 처음:

sanitizednewvalue=$(sed -E 's/([/\&])/\\\1/g' <<< "$newvalue")
sed -Ei "$rownum s/[^,]*/$sanitizednewvalue/$col" file.csv

Demo:

$ newvalue='NEW&\/&NEW'
$ sanitizednewvalue=$(sed -E 's/([/\&])/\\\1/g' <<< "$newvalue")
$ echo "$sanitizednewvalue"
NEW\&\\\/\&NEW
$ sed -Ei "$rownum s/[^,]*/$sanitizednewvalue/$col" file.csv
$ cat file.csv
Header,1
Field1,Field2,Field3
1,NEW&\/&NEW,4567
3,XYZ,7890
2021-11-24 11:13:43

이 작업을 수행합니다. 그냥 몇 가지만 나는 알고 이에 응답의`[^,]*`만 sed 할 수 있을 바꾸기 위한 특정 셀,다음 우리는 왜 포함하여[^,]*. 았다도 sed -Ei "$rownum s/$newvalue/$col" file.csv 고 그것을 던져 오류가지만 자세한 내용을 알고 싶습니다. 모든 자원을 읽에 도움이 될 것입니다.
Helium

우리가 필요한`[^,]*`기 때문에 그것이 무엇을 정의 세포 이다. sed 지 않 CSV 프로세서를,그것은 어떤 텍스트 프로세서입니다. 그래서 그것은 지식이 없고 무료 입니다. 우리가 알려야 합니다. Sed 대체 명령(s로)설명서 깊은 정보에 sed 설명서 당신은 쉽게 찾을 수 있습니다(경우에는 GNU/리눅스 또는 macOS 도 man sed 거나,더 나은 info sed). 대체 당신을 명령을 시도는 구문으로 잘못되었다,따라서 오류가 있습니다.
Renaud Pacalet

Yup,그 의미가 더 이제,때 그와 같습니다.
Helium
1

sed는 방법에 대해:

#!/bin/bash

newvalue=3
rownum=4
col=1

sed -i -E "${rownum} s/(([^,]+,){$((col-1))})[^,]+/\\1${newvalue}/" file.csv

결과 file.csv

Header,1
Field1,Field2,Field3
1,ABC,4567
3,XYZ,7890
  • ${rownum} 과 일치합니다.
  • (([^,]+,){n}) 과 일치하는 n-시간의 반복 그룹의 비 쉼표 문자 뒤에 쉼표로 구분합니다. 그런 다음 그것이 있어야 하위 문자열 기 전에는 대상(대체)열에 의해 할당 n하기 col - 1.
2021-11-24 07:21:19

비록 이것은 작지 않은 이 조금 더 복잡한 방법의 하는 일을 비교하는 방법 Renauld 의 대답이다. 처럼 왜 우리는 필요에 맞게 n-시간 반복하는 경우 우리 대신 직접 교체? 그럼에도 불구하고 도움이
Helium
0

Let's 구현하십시오 sed 명령

우리는 샘플을 고려하십시오 CSV 파일에 다음과 같은 내용:

$ cat file

Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
  1. 제 1 장 또는 열:
$ sed 's/[^,]*,//' file

25,11
31,2
21,3
45,4
12,5

이 정규표현식 검색에 대한 시퀀스의 쉼표([^,]*)문자를 삭제하는 결과 1 년에서 필드를 사용할 수 있습니다.

  1. 인쇄 마지막 분야,또는 제거를 제외한 모든 필드를 마지막 필드:
$ sed 's/.*,//' file

11
2
3
4
5

이 regex 제거한 모든 것이 마지막까지 쉼표(.*,) 는 결과를 삭제하는 모든 분야를 제외하고 마지막 필드입니다.

  1. 만 인쇄 제 1 회 분야:
$ sed 's/,.*//' file

Solaris
Ubuntu
Fedora
LinuxMint
RedHat

이 정규 표현식(,.*) 을 제거하자 1 일부터 시작 쉼표가 끝날 때까지는 결과를 삭제하는 모든 분야를 제외하고 마지막 필드입니다.

  1. 삭제 2 필드:
$ sed 's/,[^,]*,/,/' file

Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5

Regex(,[^,]*,)검색에 대한 쉼표와 일련의 문자 뒤에 쉼표하는 결과가 일치에서 2 번째 열,그리고 대체 이 패턴 매칭으로 다만 쉼표로,궁극적으로 끝나는 삭제에서의 제 2 열에 있습니다.

참고:을 삭제하는 분야에서 중간 더 험악에서 나오기 때문에 모든 분야 일치하는 말 그대로 있습니다.

  1. 만 인쇄 2nd 필드:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file

25
31
21
45
12

Regex 과 일치하는 첫번째 필드 두 번째 필드고 나머지는,그러나 그룹의 2 차 분야 혼자입니다. 전체 라인은 지금으로 대체 2 드(\1)에 따라서만 제 2 필드가 표시됩니다.

  1. 만 인쇄 라인에서는 마지막 열은 한 자리 숫자:
$ sed -n '/.*,[0-9]$/p' file

Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5

Regex(,[0-9]$)확인을 위해 한 자리에서의 마지막 필드와 p 명령어 라인과 일치하는 이 상태입니다.

  1. 숫자의 모든 라인에서 파일
$ sed = file | sed 'N;s/\n/ /'

1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5

이것은 시뮬레이션의 고양이-n 명령입니다. awk 그것을 사용하여 쉽게 특별한 변수 NR. 는'='명령의 sed 에게 줄 수의 모든 라인을 따라 라인에 의해 자체입니다. Sed 출력이 파이프를 다른 sed 명령에 가입하는 모든 2 개 라인입니다.

  1. 대체는 마지막 분야에 의하면 99 1 장은'우분투':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file

Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5

이 regex matches'우분투'를 끝까지를 제외하고 마지막 열고 그룹의 각각뿐만 아니라 그들을. 에서 교체 부분,1,2 그룹과 함께 새로운 수 99 으로 대체됩니다.

  1. 삭제 2 필드인 경우 제 1 필드가'RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file

Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5

1 드'레드햇',제 2 회 분야고 나머지 분야는 그룹,교체가 수행으로만 제 1 회 그리고 마지막 그룹,resuting 점점에서 2 번째 필드 삭제됩니다.

  1. 를 삽입하는 새로운 컬럼 끝나(마지막 열):
$ sed 's/.*/&,A/' file

Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A

Regex(.*) 경기 전체 라인으로 대체 라인 자체(&)및 새로운 분야이다.

  1. 를 삽입하는 새 열을 시작 부분에서(1 열):
$ sed 's/.*/A,&/' file

A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5

같은 마지막 예를 들어,일치하는 라인은 다음에 의하여 새 열을

이 도움이 될 것입니다. 알려해야 하는 경우 사용하여 Awk 또는 다른 명령입니다. 감사

2021-11-24 07:36:29

감사에 대한 자세한 설명은 하지만 불행히도 그렇지 않 문제를 해결합니다.
Helium

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................