csv 파일의 각 줄 끝에 awk 명령 결과를 추가하고 싶습니다.

csv 파일의 각 줄 끝에 awk 명령 결과를 추가하고 싶습니다.

다음 파일이 있습니다.

입력 파일.csv:

"Input_File:",AB-ABCDE.20220128.02064600,,,,
"Date_Time Received:","1-28-22 3:47",,,,
1, abc, xyz,pq,11
2, def, xyz,rs,22
3, ghi, xyz,tu,33
4, jkl, xyz,vw,44
5, mno, xyz,xy,55

출력 파일.csv:

1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,1-28-22 3:47
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,1-28-22 3:47
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,1-28-22 3:47
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,1-28-22 3:47
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,1-28-22 3:47

명령에서 파일 이름과 날짜/시간을 가져와 awk다음과 같이 저장합니다.

file_name=`awk -F',' 'NR==1{print $2}' InputFile.csv`
date_time=`awk -F',' 'NR==2{print $2}' InputFile.csv`

나에게 필요한 것은 캡처된 file_name과 date_time을 각 행의 마지막 2개 열로 추가하는 것입니다.

이 출력 형식을 구현하도록 도와주세요.

답변1

$ awk -F'"?,"?' -v OFS=',' 'NR<3{a[NR]=$2; next} {print $0, a[1], a[2]}' InputFile.csv
1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,1-28-22 3:47
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,1-28-22 3:47
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,1-28-22 3:47
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,1-28-22 3:47
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,1-28-22 3:47

누구든지 골프를 치고 싶다면(현재 삭제된 댓글에서 영감을 얻음) s 를 제거할 필요가 없습니다 ".

$ awk -F, '{a[NR]=$2} NR>2{print $0,a[1],a[2]}' OFS=, InputFile.csv
1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,"1-28-22 3:47"

답변2

아, 이 두 줄에는 차이가 있어요. 노력하다

awk -F, 'NR==1 {FN = $2} NR==2 {DT = $2} NR>2{print $0, FN, DT}' OFS=, InputFile.csv
1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,"1-28-22 3:47"
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,"1-28-22 3:47"

답변3

awk모든 작업을 자동으로 수행하므로 처음 두 줄의 값을 쉘 변수에 캡처할 필요가 없습니다 .

awk -F, '
    BEGIN { OFS=FS }                                       # Output separator is same as input separator
    NR==1 { inputFile=$2 }                                 # Input File
    NR==2 { dtReceived=$2; gsub("\"", "", dtReceived) }    # Date Received, without surrounding double quotes
    NR>2 { print $0, inputFile, dtReceived }               # Copy through every line appending two new fields
' InputFile.csv > OutputFile.csv

여기에는 4줄짜리 프로그램이 있습니다 awk. 모든 내용을 한 줄에 입력할 수 있지만 #그렇게 하려면 주석 섹션을 제거하세요. 그러나 몇 주(또는 몇 달) 후에 다시 읽을 때 어느 것이 더 읽기 쉬운지 고려하십시오.

awk -F, 'BEGIN{OFS=FS} NR==1{inputFile=$2} NR==2{dtReceived=$2;gsub("\"","",dtReceived)} NR>2{print $0,inputFile,dtReceived}' InputFile.csv > OutputFile.csv

CSV 파일인 경우 큰따옴표를 제거할 필요가 없습니다. 하지만 원하는 출력 파일에 해당 항목이 누락되어 있으므로 여기서도 제거했습니다.

산출

1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,1-28-22 3:47
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,1-28-22 3:47
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,1-28-22 3:47
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,1-28-22 3:47
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,1-28-22 3:47

답변4

파이썬

#!/usr/bin/python
k=open('filename','r')
fin_lines=k.readlines()
firslin=fin_lines[0].strip().split(':')[-1]
firsli_conte=firslin.replace('"','').replace(",","")
secondlin=fin_lines[1].strip().split(",")[1].replace('"','')
for test in fin_lines[2:]:
    print test.strip()+","+firsli_conte+","+secondlin






firs=$(awk -F ":" 'NR==1{gsub(/[",]/,"",$NF);print $NF}' filename )

sec=$(awk -F ":" 'NR==2{gsub(/[",]/,"",$2);gsub(/[",]/,"",$3);print $2":"$3}' filename )

awk -v firs="$firs" -v sec="$sec" 'NR>2{print $0","firs","sec}' filename

output
1, abc, xyz,pq,11,AB-ABCDE.20220128.02064600,1-28-22 3:47
2, def, xyz,rs,22,AB-ABCDE.20220128.02064600,1-28-22 3:47
3, ghi, xyz,tu,33,AB-ABCDE.20220128.02064600,1-28-22 3:47
4, jkl, xyz,vw,44,AB-ABCDE.20220128.02064600,1-28-22 3:47
5, mno, xyz,xy,55,AB-ABCDE.20220128.02064600,1-28-22 3:47

관련 정보