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

Linux-将制表符分隔符转换为管道分隔符,并删除前导&;尾随空间,linux,shell,notepad++,delimiter,trim,Linux,Shell,Notepad++,Delimiter,Trim,我想根据以下要求将平面数据文件转换为新文件: 1) 将制表符分隔符更改为桩分隔符“|” 2) 删除每个“列”上的任何前导和尾随空格 3) 有些列为NULL,我想保留NULL。e、 g.,A | | B.(第二列为空。) 示例: 原始文件(test.dat)有一行以制表符分隔的数据,共有7列,在“NY”之后的2列为空: A New York NY Meal - Seafood Grocery Department 请注意,某些字段上有前导/尾随空格:

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

1) 将制表符分隔符更改为桩分隔符“|”

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

3) 有些列为NULL,我想保留NULL。e、 g.,A | | B.(第二列为空。)

示例:

原始文件(test.dat)有一行以制表符分隔的数据,共有7列,在“NY”之后的2列为空

 A  New York    NY          Meal - Seafood       Grocery Department   
请注意,某些字段上有前导/尾随空格:

(" A ", "Meal - Seafood   ", "  Grocery Department   ")
这是我在新文件中想要的最终版本:

A|New York|NY|||Meal - Seafood|Grocery Department
任何人都可以编写一个示例代码或shell脚本,我可以在Linux中使用它来输出一个新文件吗


谢谢

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   

您可以使用
awk

鉴于:

$ cat -t file.tsv
 A ^INew York^INY^I^I^IMeal - Seafood   ^I  Grocery Department 
(选项卡显示为
^I
)在那里…)

$awk'开始{FS=“\t”;OFS=“|”}

{对于(i=1;iThanks!我尝试使用代码sed的/[[:space:]*\t[[:space:]*/|/g'test.dat>new.dat,新输出在“A”上仍有前导空格,在“杂货部”上仍有尾随空格。您错过了第一个命令。请使用我发布的内容进行尝试,而不是其中的一部分。我确实为尾随空间添加了第三个sed。但我已对此进行了测试。谢谢!它起了作用。看起来您上面的代码是2行,我尝试了退格到1行,但它不起作用。我如何写入类似于sed的新文件/[:space:]*\t[:space:]*/|/g'test.dat>new.dat?这段代码只适用于这个特定的示例吗?忽略我之前的评论。在这里它可以写入一个新文件,sed“s/^[:space:]*/“test.dat | sed”s/[:space:]*/\t[:space:]*/|/g“| sed”s/[:space:]*$/”>new.dat我的最后一个问题是,这是“通用”吗基于这两个需求,也可以处理其他类似数据的代码?这两个需求非常具体。但是,是的,对于这两个特定需求,这是“通用的”。
$ 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