linux – 在没有修改awk命令空间的情况下回显
发布时间:2020-12-14 00:02:07 所属栏目:Linux 来源:网络整理
导读:我有一个由多行组成的文件 10|EQU000000001|12345678|3456||EOMCO042|EOMCO042|31DEC2018|16:51:17|31DEC2018|SHOP NO.5,6,7 RUNWAL GRCHEMBUR MHIN|0000000010000.00|6761857316|508998|6011|GL 我必须使用字符计数将列11拆分并替换为4个不同的列. 这是包含
我有一个由多行组成的文件
10|EQU000000001|12345678|3456||EOMCO042|EOMCO042|31DEC2018|16:51:17|31DEC2018|SHOP NO.5,6,7 RUNWAL GRCHEMBUR MHIN|0000000010000.00|6761857316|508998|6011|GL 我必须使用字符计数将列11拆分并替换为4个不同的列. 这是包含额外空格的第11列. SHOP NO.5,7 RUNWAL GRCHEMBUR MHIN 这是我做的 ls *.txt *.TXT| while read line do subName="$(cut -d'.' -f1 <<<"$line")" awk -F"|" '{ "echo -n "$11" | cut -c1-23" | getline ton; "echo -n "$11" | cut -c24-36" | getline city; "echo -n "$11" | cut -c37-38" | getline state; "echo -n "$11" | cut -c39-40" | getline country; $11=ton"|"city"|"state"|"country; print $0 }' OFS="|" $line > $subName$output DONE 但是在做第11列的回声时,它会修剪额外的空格,导致字符数不匹配.没有修剪空间有没有办法回声? 实际输出 10|EQU000000001|12345678|3456||EOMCO042|EOMCO042|31DEC2018|16:51:17|31DEC2018|SHOP NO.5,7 RUNWAL GR|CHEMBUR MHIN|||0000000010000.00|6761857316|508998|6011|GL 预期产出 10|EQU000000001|12345678|3456||EOMCO042|EOMCO042|31DEC2018|16:51:17|31DEC2018|SHOP NO.5,7 RUNWAL GR|CHEMBUR|MH|IN|0000000010000.00|6761857316|508998|6011|GL 解决方法
所有这些逻辑的纯粹bash实现
#!/usr/bin/env bash shopt -s nocaseglob extglob for f in *.txt; do subName=${f%.*} while IFS='|' read -r -a fields; do location=${fields[10]} ton=${location:0:23}; ton=${ton%%+([[:space:]])} city=${location:23:12}; city=${city%%+([[:space:]])} state=${location:36:2} country=${location:38:2} fields[10]="$ton|$city|$state|$country" printf -v out '%s|' "${fields[@]}" printf '%sn' "${out:0:$(( ${#out} - 1 ))}" done <"$f" >"$subName.out" done 它比纯awk更慢(如果我做得好,大约10倍),但比问题中提出的awk / shell组合快得多. 进入使用的结构: >所有${varname%…}和相关结构都是parameter expansion.特定${varname%pattern}构造从varname中的值中删除模式的最短匹配,如果%替换为%%,则删除最长匹配.>使用extglob启用扩展的globbing语法,例如([[:space:]]),它等同于正则表达式语法[[:space:]]. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |