linux - unix - 剪切命令(添加自己的定界符)

标签 linux bash shell unix scripting

给定一个包含这样数据的文件(即 stores.dat 文件)

id               storeNo     type
2ttfgdhdfgh      1gfdkl-28   kgdl
9dhfdhfdfh       2t-33gdm    dgjkfndkgf

期望的输出:

id               |storeNo     |type
2ttfgdhdfgh      |1gfdkl-28   |kgdl
9dhfdhfdfh       |2t-33gdm    |dgjkfndkgf

想加个“|”这 3 个切割范围中的每一个之间的分隔符:

cut -c1-18,19-30,31-40 stores.dat

在每个片段之间插入分隔符的语法是什么?

BONUS pts(如果您可以提供像这样修剪值的选项):

id|storeNo|type
2ttfgdhdfgh|1gfdkl-28|kgdl
9dhfdhfdfh|2t-33gdm|dgjkfndkgf\

更新(感谢 Mat 的回答)我最终在这个解决方案上取得了成功 - (它有点困惑但是我的 bash 版本的 SunOS 似乎不支持更优雅的算法)

#!/bin/bash
unpack=""
filename="$1"
while [ $# -gt 0 ] ; do
    arg="$1"
    if [ "$arg" != "$filename" ]
    then
        firstcharpos=`echo $arg | awk -F"-" '{print $1}'`
        secondcharpos=`echo $arg | awk -F"-" '{print $2}'`
        compute=`(expr $firstcharpos - $secondcharpos)`
        compute=`(expr $compute \* -1 + 1)`
        unpack=$unpack"A"$compute
    fi
    shift
done
perl -ne 'print join("|",unpack("'$unpack'", $_)), "\n";' $filename 

用法:sh test.sh input_file 1-17 18-29 30-39

最佳答案

因为您在示例中使用了cut。 假设每个字段都用制表符分隔:

$ cut  --output-delimiter='|' -f1-3 input
id|store|No
2ttfgdhdfgh|1gfdkl-28|kgdl
9dhfdhfdfh|2t-33gdm|dgjkfndkgf

如果不是这种情况,请添加输入分隔符开关 -d

关于linux - unix - 剪切命令(添加自己的定界符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8630053/

相关文章:

linux - 如何使用 ed 在最后一次模式匹配后添加文本

linux - 将参数以 txt 文件的形式传递到 shell 脚本中

linux - 查找文件中一组行中最深(正确的)的行 Unix/Linux

shell - 如何知道 Puma 中的事件线程数

java - 如何从 java 包运行 Applescript

linux - 使用区分大小写的名称重命名文件夹

c - 串口通讯

linux - 用户环境不是来自 chroot

c# - 从 Mono C# 运行 Bash 命令

linux - Amazon AWS EC2 Linux 上的 Node-gyp Connect-mongo