我有一個如下的 csv 檔案:
http://www.a.com/1,apple
http://www.a.com/2,apple
http://www.a.com/3,apple
http://www.a.com/4,apple
...
http://www.z.com/1,flower
http://www.z.com/2,flower
http://www.z.com/3,flower
...
我想將 csv 檔案合并到新的 csv 檔案中,如下所示:
"http://www.a.com/1
http://www.a.com/2
http://www.a.com/3
http://www.a.com/4
",apple
"http://www.z.com/1
http://www.z.com/2
http://www.z.com/3
http://www.z.com/4
...
http://www.z.com/100
",flower
"http://www.z.com/101
http://www.z.com/102
http://www.z.com/103
http://www.z.com/104
...
http://www.z.com/200
",flower
我想保留每個單元格的第一列最多有 100 行 http url。第二列相同的值將出現在相應的單元格中。
有沒有很簡單的命令模式來實作這個想法?
我使用了以下命令:
awk '{if(NR0!=0)ORS="\t";else ORS="\n"}1' test.csv > result.csv
uj5u.com熱心網友回復:
第一種解決方案:使用您顯示的示例,請嘗試以下awk代碼。
awk '
BEGIN{
s1="\""
FS=OFS=","
}
prev!=$2 && prev{
print s1 val s1,prev
val=""
}
{
val=(val?val ORS:"")$1
prev=$2
}
END{
if(val){
print s1 val s1,prev
}
}
' Input_file
第二種解決方案:如果您的 Input_file 未按第二列排序,請嘗試以下sort awk代碼。
sort -t, -k2 Input_file |
awk '
BEGIN{
s1="\""
FS=OFS=","
}
prev!=$2 && prev{
print s1 val s1,prev
val=""
}
{
val=(val?val ORS:"")$1
prev=$2
}
END{
if(val){
print s1 val s1,prev
}
}
'
輸出如下:
"http://www.a.com/1
http://www.a.com/2
http://www.a.com/3
http://www.a.com/4",apple
"http://www.z.com/1
http://www.z.com/2
http://www.z.com/3",flower
uj5u.com熱心網友回復:
$ awk -F, '$2!=p || n==100 {if(NR!=1) print "\"," p; printf "\""; p=$2; n=0}
{print $1; n =1} END {print "\"," p}' test.csv
"http://www.a.com/1
http://www.a.com/2
http://www.a.com/3
http://www.a.com/4
",apple
"http://www.z.com/1
http://www.z.com/2
http://www.z.com/3
",flower
首先將欄位分隔符設定為逗號 ( -F,)。然后:
- 如果第二個欄位發生變化 (
$2!=p) 或者我們已經在當前批次中列印了 100 行 (n==100):- 如果不是第一行,則列印雙引號、逗號、前第二個欄位和換行符,
- 列印雙引號,
- 將新的第二個欄位存盤在變數
p中以供以后比較, - 重置線路計數器
n。
- 對于所有行,列印第一個欄位并增加行計數器
n。 - 最后列印雙引號、逗號和第二個欄位的最后一個值。
uj5u.com熱心網友回復:
鑒于:
cat file
http://www.a.com/1,apple
http://www.a.com/2,apple
http://www.a.com/3,apple
http://www.a.com/4,apple
http://www.z.com/1,flower
http://www.z.com/2,flower
http://www.z.com/3,flower
這是執行此操作的兩遍awk:
awk -F, 'FNR==NR{seen[$2]=FNR; next}
seen[$2]==FNR{
printf("\"%s%s\"\n,%s\n",data,$1,$2)
data=""
next
}
{data=data sprintf("%s\n",$1)}' file file
如果您想在更改$2值或以某個固定的行間隔(如100)進行列印,您可以執行以下操作:
awk -F, -v n=100 'FNR==NR{seen[$2]=FNR; next}
seen[$2]==FNR || FNR%n==0{
printf("\"%s%s\"\n,%s\n",data,$1,$2)
data=""
next
}
{data=data sprintf("%s\n",$1)}' file file
要么列印:
"http://www.a.com/1
http://www.a.com/2
http://www.a.com/3
http://www.a.com/4"
,apple
"http://www.z.com/1
http://www.z.com/2
http://www.z.com/3"
,flower
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439531.html
下一篇:如何定時魚提示
