微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 在没有修改awk命令空间的情况下回显

我有一个由多行组成的文件

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,6,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,6,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,6,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 '%s\n' "${out:0:$(( ${#out} - 1 ))}"
  done <"$f" >"$subName.out"
done

它比纯awk更慢(如果我做得好,大约10倍),但比问题中提出的awk / shell组合快得多.

进入使用的结构:

>所有${varname%…}和相关结构都是parameter expansion.特定${varname%pattern}构造从varname中的值中删除模式的最短匹配,如果%替换为%%,则删除最长匹配.
>使用extglob启用扩展的globbing语法,例如([[:space:]]),它等同于正则表达式语法[[:space:]].

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐