too*_*oop 3 unix linux bash shell scripting
给定一个包含这样数据的文件(即stores.dat文件)
id storeNo type
2ttfgdhdfgh 1gfdkl-28 kgdl
9dhfdhfdfh 2t-33gdm dgjkfndkgf
Run Code Online (Sandbox Code Playgroud)
期望的输出:
id |storeNo |type
2ttfgdhdfgh |1gfdkl-28 |kgdl
9dhfdhfdfh |2t-33gdm |dgjkfndkgf
Run Code Online (Sandbox Code Playgroud)
想添加一个"|" 这3个切割范围中的每一个之间的分隔符:
cut -c1-18,19-30,31-40 stores.dat
Run Code Online (Sandbox Code Playgroud)
在每个剪切之间插入分隔符的语法是什么?
BONUS pts(如果您可以提供修剪值的选项):
id|storeNo|type
2ttfgdhdfgh|1gfdkl-28|kgdl
9dhfdhfdfh|2t-33gdm|dgjkfndkgf\
Run Code Online (Sandbox Code Playgroud)
更新(感谢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
Run Code Online (Sandbox Code Playgroud)
用法: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
Run Code Online (Sandbox Code Playgroud)
如果不是这种情况,请添加输入分隔符开关 -d
| 归档时间: |
|
| 查看次数: |
16854 次 |
| 最近记录: |