Cut

你能指定一個用於切割的外殼嗎?

  • November 27, 2012

可能重複:

是否有用於處理 csv 文件的強大命令行工具?

我可以用來cut從文件中提取列:

$ cat foo
foo,bar,hello
bash,baz,world

$ cut -d\, -f2 foo
bar
baz

但是,如果一列中有一個分隔符在這樣的外殼內是安全的呢?

$ cat foo
foo,"hello, world",bar
bash,goodbye,baz

$ cut -d\, -f2 temp12
"hello
goodbye

有沒有辦法告訴cut尊重引號""字元的包圍?

cut如果您首先預處理其輸入以轉義引號內的字元(例如,將“_”替換為“_u”,將“,”替換為引號內的“_c”,或者將每個字元替換為它們的 2 字節十六進製表示法,則可以做到這一點) 並對其進行後處理以恢復該轉義。

就像是:

perl -pe 's/"(.*?)"/"\"".unpack("H*", $1)."\""/ge' |
 cut -d, -f2 |
 perl -pe 's/"(.*?)"/"\"".pack("H*",$1)."\""/ge'

(假設引號內(或外)沒有轉義引號)。

但是,考慮到它需要付出的努力,您不妨使用適當的 csv 解析器,或者使用類似 perl 的正則表達式引擎來完成它。

絕對不適合 GNU cut,至少:

/* The delimeter character for field mode. */ static unsigned char delim;

(如 GNU coreutils 原始碼所示)

引用自:https://unix.stackexchange.com/questions/56836