加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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:]].

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读