簡體   English   中英

Unix - 刪除前導/尾隨空格(按列)

[英]Unix - Remove Leading/Trailing Spaces (Column Wise)

我有如下文本行:

P,   123456  ,01,A,H, 123456 ,123456 123456 ,,
P,123456   ,01,A,H, 123456,   123456 123456,,
P,  123456,01,A,H,123456 ,123456 123456 ,,
P, 123456,01,A,H,   123456,  123456 123456,,
P,123456 ,01,A,H,123456   ,123456 123456  ,,

我希望它們如下所示:

P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,
P,123456,01,A,H,123456,123456 123456,,

要求:

  1. 僅從 2,6,7 列中刪除所有前導和尾隨空格
  2. 第 7 列中的值應僅由一個空格分隔

研究:

我嘗試了awksedtr多種組合,但無法根據我的要求成功。 我想在awksedtr有一個更好的解決方案,因為我所有的客戶都安裝了有限的 CYGWIN。 所以我不能要求我所有的客戶安裝新的可執行文件。

你可以使用這個awk

awk -F' *, *' '$1=$1' OFS=, file

可以理解的方式:

awk 'BEGIN{FS=" *, *"; OFS=","} $1=$1' file

正如@glennjackman 所評論的,使用更安全

awk 'BEGIN{FS=" *, *"; OFS=","} {$1=$1; print}' file

說明:

  • FS - 設置輸入字段分隔符
  • OFS - 設置輸出字段分隔符
  • $1=$1 - 這將使awk使用OFS格式化字段。 這將返回true使awk打印當前行(重新格式化)。

sed 也是一個不錯的選擇。

sed 's/ *, */,/g' file

我們假設這個 CSV 文件不包含這樣的行:

a, b, "this field, this very one, should not be touched", d

你可以使用這個awk:

awk -F',' -v OFS=',' '{for (i=1;i<=NF;i++) gsub(/^ +| +$/,"",$i); print $0}' file_path

或:

awk -F' *, *' '{for(i = 1; i < NF; i++) {printf $i","}; printf $NF"\n"}' file_path

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM