首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过shell读取应用csv中特定列的反向函数

通过shell读取应用csv中特定列的反向函数
EN

Stack Overflow用户
提问于 2018-07-25 16:55:30
回答 2查看 74关注 0票数 0

如何反转csv中第10列数据的具体条件。输入文件:

代码语言:javascript
复制
RFIN0010|TD|379410|3261664|44753406|CAD|MC|SALE|S|4|8275.08|USD|0.76644909
RFIN0010|TD|379410|3261666|44753408|CAD||IA|S||-335.81|USD|
RFIN0010|TD|379410|3261666|44753408|CAD||PFEE|S||-15.31|USD|
HFIN0010T|362051|11/01/2017|11/01/2017|11/02/2017|08:55:43
RFIN0011|PFEE|DEP|TD|379410|3261666|44753408|USD|27366020|MC||"Fee"|S|4|0.0000|6342.43|0.000500|-3.18|CAD
HACT0010|362051|11/01/2017|11/01/2017|11/02/2017|08:48:41
RACT0010|11/01/2017|871889|"online3"|"1238"|12152|TD|349239|USD|"abc87905"||xxx01|06/20|12.00|VI|DP|10/31/2017|88450G|100||||7311||||||V383|N|.1|.0225|-.37|-.02||USD|""|

我想要RACT0010第10列数据反转

输出:

代码语言:javascript
复制
 RFIN0010|TD|379410|3261664|44753406|CAD|MC|SALE|S|4|8275.08|USD|0.76644909
 RFIN0010|TD|379410|3261666|44753408|CAD||IA|S||-335.81|USD|
 RFIN0010|TD|379410|3261666|44753408|CAD||PFEE|S||-15.31|USD|   
 HFIN0010T|362051|11/01/2017|11/01/2017|11/02/2017|08:55:43

 RFIN0011|PFEE|DEP|TD|379410|3261666|44753408|USD|27366020|MC||"Fee"|S|4|0.0000|6342.43|0.000500|-3.18|CAD
 HACT0010|362051|11/01/2017|11/01/2017|11/02/2017|08:48:41
    RACT0010|11/01/2017|871889|"online3"|"1238"|12152|TD|349239|USD|"50978cba"||xxx01|06/20|12.00|VI|DP|10/31/2017|88450G|100||||7311||||||V383|N|.1|.0225|-.37|-.02||USD|""|

我的shell:

代码语言:javascript
复制
#!/bin/bash
for j in *.dfr;
do
FILE=$j;
echo $j++ |awk '{if ($1=="RACT0010"){$10=reverse$10} else {$1=$1} print}' FS='|' OFS='|' $j> rev/$j
done;
EN

回答 2

Stack Overflow用户

发布于 2018-07-25 17:14:40

您的问题的awk部分可以像这样解决(为了清楚起见,添加了换行和注释):

代码语言:javascript
复制
awk '$1 == "RACT0010" {              # use a condition, not an "if"
  n = split($10, a, //)              # split into array of characters
  s = ""                             # initialise s to empty
  for (i = n; i > 0; i--) s = s a[i] # build new reversed string
  $10 = s                            # overwrite original field
} 
1' FS='|' OFS='|' file               # 1 is shortest true condition

把这个放到你的循环中:

代码语言:javascript
复制
for j in *.dfr; do
    awk '$1 == "RACT0010" { 
      n = split($10, a, //); s = ""; for (i = n; i > 0; i--) s = s a[i]; $10 = s 
    } 1' FS='|' OFS='|' "$j" > rev/"$j"
done

正如注释中所指出的,规范并不保证使用带有//split将字符串拆分成单独的字符。在GNU awk中它可以工作,但在其他地方可能不行。反转字符串的另一种方法是重复调用substr

代码语言:javascript
复制
s = ""
len = length($10)
for (i = 0; i < len; ++i) s = s substr($10, len - i, 1)
票数 1
EN

Stack Overflow用户

发布于 2018-07-25 17:20:15

代码语言:javascript
复制
#!/bin/bash

mkdir -p rev
for j in *.dfr
do
    awk '{if ($1=="RACT0010"){x=""; for(i=length($10); i!=0; i--) {x=x substr($10, i, 1)}; $10=x}; print}' FS='|' OFS='|' $j > rev/$j
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51514782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档