정렬을 사용자 정의하고 탭으로 구분된 파일의 여러 열에서 밑줄로 연결된 큰따옴표를 제거합니다.

정렬을 사용자 정의하고 탭으로 구분된 파일의 여러 열에서 밑줄로 연결된 큰따옴표를 제거합니다.


주제 열 순서에 따른 맞춤 정렬은 수학, 영어, 과학이어야 합니다.

다음 명령을 사용할 때

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

myfile.csv이렇게 됐는데 다른 걸 원했어

"101"    "Anna"    "Maths"    "V"
"102"    "Bob"    "Maths"    "V"
"103"    "Charles"    "Science"    "VI"
"104"    "Darwin"    "Science"    "VI"
"105"    "Eva"    "English"    "VII"

과목 열 순서에 따라 정렬은 수학, 영어, 과학이어야 합니다.

아래와 같이 큰따옴표를 제거하고 밑줄로 연결합니다.

101_Anna_Maths_V
102_Bob_Maths_V
105_Eva_English_VII
103_Charles_Science_VI
104_Darwin_Science_VI

원본 파일: 출력cat myfile.csv

Sl.No,RollNo,Names,Class,Subject
1,101,Anna,V,Maths
2,102,Bob,V,Maths
3,103,Charles,VI,Science
4,104,Darwin,VI,Science
5,105,Eva,VII,English

답변1

원래 명령은 다음과 같습니다.

awk -F',' '{if (NR!=1) {print $2,$3,$5,$4}}' myfile.csv

귀하의 명령은 awk관용적으로 작성되었습니다.

awk -F',' 'NR > 1 { print $2, $3, $5, $4 }' myfile.csv

각 입력 줄에서 큰따옴표를 모두 제거하려면 위 명령을 수정하세요 NR > 1.

awk -F',' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv

위 명령은 _출력 필드 구분 기호( OFS)를 사용하여 출력하도록 수정되었습니다.

awk -F',' -vOFS='_' 'NR > 1 { gsub(/"/, ""); print $2, $3, $5, $4 }' myfile.csv

답변2

질문이 수정되었으므로 sed주어진 입력에 대해 다음 솔루션을 사용하여 다음을 얻으십시오.

  1. 슬라이딩 필드 #4 및 #5
  2. 첫 번째 필드 삭제
  3. 쉼표를 밑줄로 바꾸기
  4. 첫 번째 줄을 제목으로 건너뛰기
sed -r '2,$s/^[^,]*,// ; 2,$s/^([^,]*,[^,]*)(,[^,]*)(.*)/\1\3\2/ ; 2,$s/,/_/g'

사용 sed.

sed 's/"//g;s/[[:space:]]\+/_/g;/^$/d' infile
  • s/"//g그러면 모든 따옴표가 제거됩니다 ".
  • [[:space:]]\+이는 하나 이상의 공백을 단일 밑줄로 대체합니다 _.
  • /^$/d이렇게 하면 빈 줄이 제거됩니다. 빈 줄이 없으면 명령에서 제거할 수 있습니다. 또는 /^[[:space:]]*$/d공백/탭/빈 줄만 제거하도록 변경하세요.

구현이 이를 지원하지 않는 경우 \+동등한 표준으로 대체하십시오.\{1,\}sed

답변3

암소 비슷한 일종의 영양쉼표로 구분된 입력 파일에 대한 솔루션(귀하의 의견에 따름 -F','):

awk -v FPAT='[^",[:space:]]+' 'NR>1{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF)?OFS:ORS }' OFS='_' myfile.csv

산출:

01_Anna_Maths_V
102_Bob_Maths_V
103_Charles_Science_VI
104_Darwin_Science_VI
105_Eva_Maths_VII

관련 정보