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