次のファイルがあります。
入力ファイル.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
ああ、この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
すべての操作が自動的に実行されるため、最初の2行の値をシェル変数にキャプチャする必要はありません。
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
。すべての内容を1行に入力できますが、#
そうするにはコメントセクションを削除してください。ただし、数週間(または数ヶ月)後に再度読んでいるとき、どちらがより読みやすいかを検討してください。
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
Python
#!/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