我有一個帶有 sed 命令的 bash 腳本,我想在 csv 檔案上運行它來更改某些欄位的順序。這是我嘗試過的:
sed -r '{
s/(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)/\1,\2,\3,\4,\5,\6,\8,\9,\10,\11,\7/
}' $1
問題來了,因為我有 11 個欄位(即兩位數)所以當我指定所需的順序時,即
"\1,\2,\3,\4,\5,\6,\8,\9,\10,\11,\7/"
10 和 11 被視為文字,這破壞了我的嘗試。我嘗試了明顯的替代方案,例如:
"\1,\2,\3,\4,\5,\6,\8,\9,(10),(11),\7/"
或者
"\1,\2,\3,\4,\5,\6,\8,\9,{10},{11},\7/"
或者
"\1,\2,\3,\4,\5,\6,\8,\9,\(10),\(11),\7/"
或者
"\1,\2,\3,\4,\5,\6,\8,\9,\{10},\{11},\7/"
但這些都不起作用,它們也被視為文字。我的想象力不多了,不知道還能嘗試什么,有什么想法嗎?
我知道還有其他方法可以解決這個問題(例如awk等),但是如果您的答案集中在我將不勝感激,sed因為我的其余代碼都是使用sed.
在此先感謝大家!
uj5u.com熱心網友回復:
我看到三個塊:欄位 1-6、欄位 7 和其余部分。所以你可以使用
sed -r '{s/^(([^,]*,){6})([^,]*),(.*)/\1\4,\3/}'
uj5u.com熱心網友回復:
從info sed
REPLACEMENT 可以包含 '\N' (N 是從 1 到 9 的數字,包括在內)參考,它指的是包含在第 N 個 '(' 及其匹配的 ')' 之間的匹配部分。
所以\10 將按字面意思理解。
perl但是沒有這個限制
$ perl -pe 's/([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )([^ ]* )(.*)/$14 $13$12$11$10$9$8$7$6$5$4$3$2$1/g;' <<< "one two three four five six seven eight nine ten eleven twelve thirteen fourteen"
fourteen thirteen twelve eleven ten nine eight seven six five four three two one
uj5u.com熱心網友回復:
我不會(ab)使用 sed,而是使用csvcutcsvkit實用程式包來處理 CSV 檔案:
csvcut -c 1,2,3,4,5,6,8,9,10,11,7 old.csv > new.csv
或perl改用:
perl -F, -lane 'print join(",", @F[0..5, 7..10, 6])' old.csv > new.csv
(用逗號將每一行分成一個陣列,并列印出重新排序的版本;不需要丑陋的正則運算式。)
uj5u.com熱心網友回復:
根本沒有辦法sed參考第 10 次或以后的捕獲;只有\1通過才被\9認可。
這類事情更多的是在 的駕駛室中awk,所以即使您要求sed解決方案,我也會提供幾個awk解決方案作為示例。
由于awk可以愉快地識別多位數的欄位編號,并且我們實際上別無選擇,只能將每次出現的欄位分隔符都視為標記一個新欄位,因此我們將所有欄位分開計算,這與@leu 的sed答案不同。但這意味著這些解決方案更容易修改,以便更徹底地洗牌。
這是一個簡單的欄位分配序列,帶有一個臨時變數來記住第一個,直到我們需要它:
$ awk -v{,O}FS=, '{t=$7;$7=$8;$8=$9;$9=$10;$10=$11;$11=t}1'
盡管由于您將整個欄位塊向左移動了一個位置,但也許更系統的回圈方法是合適的:
$ awk -v{,O}FS=, '{t=$7; for (i=7;i<11; i) { $i=$(i 1) }; $11=t}1'
如果您將大量專案移動相同的數量,則回圈會更有意義;如果重新排列更加隨機,則一系列直接分配將更有意義。在這種情況下,它們的代碼量大致相同,所以這是一個折騰。
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed -E 's/,?[^,]*/\n&\n/7;s/\n(.*)\n(.*)/\2\1/' file
用換行符分隔第七個欄位,然后將其交換到行尾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487308.html
下一篇:比較bash腳本中的日期
