【问题标题】:Replace value of a specific column from a file替换文件中特定列的值
【发布时间】:2020-10-23 01:27:33
【问题描述】:

我有一个大小约为 1 GB 的文件,该文件包含以下格式的数据。

A|CD|44123|0|0
B|CD|44124|0|0
C|CD|44125|0|0
D|CD|44126|0|0
E|CD|44127|0|0
F|CD|44128|0|0
J|CD|44129|0|0
I|CD|44130|0|0

在这个文件中,我必须用转换后得到的值替换第三列值。为此我必须打开这个文件,然后读取文件并替换它。这个过程大约需要 5 个小时。下面是我正在使用的代码

cat $FILE_NAME |\
while read REC
do
  DATE=`echo "$REC" | cut -d\| -f3`
  DATE_NEW=`$UTIL $DATE | head -1 |cut -d" " -f12`
  RECORD="$DATE_NEW,"
  echo "$RECORD" >> $New_File
done

有什么方法可以让这件事变得更好更快。

所需的输出将是这样的,其中DATE_NEW 值将放置在每个第 3 列 DATE_NEW 值将是我将从中获得的转换值

DATE_NEW=`$UTIL $DATE | head -1 |cut -d" " -f12`

A|CD|10/20/2020|0|0
B|CD|10/25/2020|0|0
C|CD|10/25/2020|0|0
D|CD|10/25/2020|0|0
E|CD|11/15/2020|0|0
F|CD|11/14/2020|0|0
J|CD|11/16/2020|0|0
I|CD|11/17/2020|0|0

@Sundeep 发表评论后,为什么使用 shell 循环处理文本被认为是不好的做法?我在 Perl 中编写了逻辑,在 Perl 中处理时间为 5-7 小时,完成工作需要 99 秒。

【问题讨论】:

标签: shell awk sed


【解决方案1】:

试试这个:

awk -v cmd="Cmd2GetNEWDATE" 'BEGIN{FS=OFS="|"}{cmd|getline v;close(cmd)}$3=v' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2020-10-19
    • 2020-09-25
    相关资源
    最近更新 更多