我有多個 *csv 檔案,貓喜歡:
#sample,time,N
SPH-01-HG00186-1_R1_001,8.33386,93
SPH-01-HG00266-1_R1_001,7.41229,93
SPH-01-HG00274-1_R1_001,7.63903,93
SPH-01-HG00276-1_R1_001,7.94798,93
SPH-01-HG00403-1_R1_001,7.99299,93
SPH-01-HG00404-1_R1_001,8.38001,93
我嘗試將 csv 檔案爭吵到:
#sample,time,N
HG00186,8.33386,93
HG00266,7.41229,93
HG00274,7.63903,93
HG00276,7.94798,93
HG00403,7.99299,93
HG00404,8.38001,93
我做了:
for i in $(ls *csv); do line=$(cat ${i} | grep -v "#" | cut -d'-' -f3); sed 's/*${line}*/${line}/g'; done
然而沒有結果出現......有什么建議嗎?謝謝。
uj5u.com熱心網友回復:
使用awk和分割每一行的邏輯,,然后將它們的第一個欄位分割為-:
awk -v FS=',' -v OFS=',' 'NR > 1 { split($1,w,"-"); $1 = w[3] } 1' file.csv
使用sed一個強大的正則運算式,它不可能修改其他欄位:
sed -E 's/^([^,-]*-){2}([^,-]*)[^,]*/\2/' file.csv
# or
sed -E 's/^(([^,-]*)-){3}[^,]*/\2/' file.csv
uj5u.com熱心網友回復:
使用這個 Perl 單行:
perl -i -pe 's{.*?-.*?-(.*?)-.*?,}{$1,}' *.csv
Perl 單行器使用這些命令列標志:
-e:告訴 Perl 查找行內代碼,而不是在檔案中。
-p:一次回圈輸入一行,$_默認情況下將其分配給。print $_在每次回圈迭代后添加。
-i.bak:就地編輯輸入檔案(覆寫輸入檔案)。在覆寫之前,通過在其名稱后附加擴展名來保存原始檔案的備份副本.bak(您可以省略.bak,以避免創建任何備份檔案)。
還請參見
perldoc perlrun::如何執行 Perl 解釋器:命令列開關
perldoc perlre:Perl 正則運算式(正則運算式)
perldoc perlre:Perl 正則運算式(正則運算式):量詞;字符類和其他特殊轉義;斷言;捕獲組
perldoc perlrequick:Perl 正則運算式快速入門
uj5u.com熱心網友回復:
您可以使用
sed -E 's/^[^-] -[0-9] -([^-] )[^,] /\1/' file > newfile
詳情:
-E- 啟用 POSIX ERE 正則運算式風格^[^-] -[0-9] -([^-] )[^,]- 搜索的正則運算式模式^- 字串的開始[^-]- 一個或多個非連字符-- 一個連字符[0-9]- 一位或多位數字-- 一個連字符([^-] )- 第 1 組:一個或多個非連字符[^,]- 一個或多個非逗號字符
\1- 將匹配替換為第 1 組值。
查看在線演示:
#!/bin/bash
s='SPH-01-HG00186-1_R1_001,8.33386,93
SPH-01-HG00266-1_R1_001,7.41229,93
SPH-01-HG00274-1_R1_001,7.63903,93
SPH-01-HG00276-1_R1_001,7.94798,93
SPH-01-HG00403-1_R1_001,7.99299,93
SPH-01-HG00404-1_R1_001,8.38001,93'
sed -E 's/^[^-] -[0-9] -([^-] )[^,] /\1/' <<< "$s"
輸出:
HG00186,8.33386,93
HG00266,7.41229,93
HG00274,7.63903,93
HG00276,7.94798,93
HG00403,7.99299,93
HG00404,8.38001,93
uj5u.com熱心網友回復:
您可以使用 bash 引數擴展來破壞文本,而無需借助 awk 和 sed 等外部??工具:
IFS=","
while read -r -a line; do
x="${line[0]%-*}"
x="${x##*-}"
printf "%s,%s,%s\n" "$x" "${line[1]}" "${line[2]}"
done < input.txt
或者你可以用簡單的 awk 來完成,就像其他人所做的那樣。
awk '{print $3,$5,$6}' FS='[-,]' OFS=, < input.txt
uj5u.com熱心網友回復:
如果您需要以cut任何價格使用,那么我建議您遵循以下解決方案,讓file.txt內容成為
#sample,time,N
SPH-01-HG00186-1_R1_001,8.33386,93
SPH-01-HG00266-1_R1_001,7.41229,93
SPH-01-HG00274-1_R1_001,7.63903,93
SPH-01-HG00276-1_R1_001,7.94798,93
SPH-01-HG00403-1_R1_001,7.99299,93
SPH-01-HG00404-1_R1_001,8.38001,93
然后
head -1 file.txt && tail -6 file.txt | tr '-' ',' | cut --delimiter=',' --fields=3,5,6
給出輸出
#sample,time,N
HG00186,8.33386,93
HG00266,7.41229,93
HG00274,7.63903,93
HG00276,7.94798,93
HG00403,7.99299,93
HG00404,8.38001,93
說明:輸出第一行,head然后使用 ram 6 最后一行到tr替換-使用,finally 使用cut分隔,符并指定所需的欄位。
uj5u.com熱心網友回復:
{m,n,g}awk NF FS='^[^-] -[^-] -|-[^,] ' OFS=
|
#sample,time,N
HG00186,8.33386,93
HG00266,7.41229,93
HG00274,7.63903,93
HG00276,7.94798,93
HG00403,7.99299,93
HG00404,8.38001,93
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491448.html
