Linux - 转换制表符分隔为管道分隔并删除前导&尾随空间

时间:2017-07-19 23:47:12

标签: linux shell notepad++ delimiter trim

我想根据以下要求将平面数据文件转换为新文件:

  

1)更改制表符分隔为桩分隔" |"。

     

2)删除每个"列上的任何前导和尾随空格"。

     

3)有些列是NULL,我想保留null。例如,A || B. (第二列为空。)

示例:

原始文件(test.dat)有一行制表符分隔数据,共7列, 2列后" NY"是NULL

 A  New York    NY          Meal - Seafood       Grocery Department   

请注意某些字段有前导/尾随空格:

(" A ", "Meal - Seafood   ", "  Grocery Department   ")

这是我在新文件中想要的最终版本:

A|New York|NY|||Meal - Seafood|Grocery Department
  

任何人都可以编写我可以在Linux中使用的示例代码或shell脚本来输出新文件吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

posix字符类[[:space:]],您可以使用*来匹配零个或多个空格。文字\t与标签匹配。像,

$ sed "s/^[[:space:]]*//" test.dat | sed "s/[[:space:]]*\t[[:space:]]*/|/g" \
     | sed "s/[[:space:]]*$//" 
A|New York|NY|Meal - Seafood|Grocery Department   

$ cat test.dat
A   New York    NY   Meal - Seafood Grocery Department   

答案 1 :(得分:0)

您可以使用awk

假设:

$ cat -t file.tsv
 A ^INew York^INY^I^I^IMeal - Seafood   ^I  Grocery Department 

(标签显示为^I)那里......)

$ awk 'BEGIN{FS="\t"; OFS="|"} 
     {for (i=1; i<=NF;i++) {
         gsub(/^[ ]+/,"",$i); gsub(/[ ]+$/,"",$i) 
        }
  } 1' file.tsv
A|New York|NY|||Meal - Seafood|Grocery Department