首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中使用参数文本文件

在bash中使用参数文本文件
EN

Stack Overflow用户
提问于 2014-09-18 04:01:38
回答 2查看 232关注 0票数 2

如何通过依赖另一个文件来更改记录的第三个字段?可以使用awk吗?

对不起,我是新手。

示例:记录

代码语言:javascript
复制
xxxx xxxx 1234 xxxx
xxxx xxxx 5678 xxxx

参数(另一个文件)

代码语言:javascript
复制
1234,9001
5678,9020

我的预期产出是

代码语言:javascript
复制
xxxx xxxx 9001 xxxx
xxxx xxxx 9020 xxxx

一瞥我的代码

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

 SRC=/home

 FILE_LIST=`sqlplus -s idmp_stg/idmp_stg@DTPMPDR07_SUDB << EOF
 set echo off head off feed off pagesize 0 trimspool on linesize 1000 colsep ,
 spool output.csv
 SELECT * from USAGE_TYPE_PARAM;             
 spool off;
 exit;
 EOF`

#Using while loop read values into variables from CSV file and create flat file 
 for    each records
 counter=1
 while IFS=, read V1 V2
 do
 echo "${V1} ${V2}" > param_${counter}.txt
 counter=$(( counter + 1 ))
 done < output.csv


 cd $SRC

 ls D* | while read FILES
 do

  #--this supposed to change the 3rd field of the file but it doesn't show 
  #--an output,       just zero byte file
  awk 'NR==FNR{a[$1]=$2;next}{$3=a[$3]}1' FS="," output.csv FS=" " $FILES >  
  final_output.txt

  done`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-18 04:12:20

代码语言:javascript
复制
$ awk 'NR==FNR{a[$1]=$2;next} {$3=a[$3];print}' <(tr , " " <Parameter) Records 
xxxx xxxx 9001 xxxx
xxxx xxxx 9020 xxxx

解释:

一次吃一片:

  • NR==FNR{a[$1]=$2;next} awk正在处理两个文件,一个接一个,一次一行。NR是读取的行总数,FNR是当前文件中读取的行数。所以,当NR==FNR时,我们在第一个文件中,在这个例子中,它是参数。因此,只有在读取参数时才执行这些命令。a[$1]=$2创建一个字典,其键是第一个字段,对应的值是参数的第二个字段。next命令告诉awk忽略剩下的awk命令,跳到下一行。
  • {$3=a[$3];print} 由于上面的next语句,这些命令只在读取第二个文件时执行。他们将第三个字段更改为它的新值,并打印这一行。
  • <(tr , " " <Parameter) 与记录不同,文件参数是逗号分隔的.在这里,tr命令用于在awk读取之前将其从逗号分隔转换为空格分隔。<(...)构造称为进程替换。

POSIX或mksh或pdsh

进程替换是一个bash/ksh/zsh扩展,不是所有shell都支持的。要在不使用进程替换的情况下运行此操作:

代码语言:javascript
复制
$ tr , " " <Parameter | awk 'NR==FNR{a[$1]=$2;next} {$3=a[$3];print}' - Records 
xxxx xxxx 9001 xxxx
xxxx xxxx 9020 xxxx

在这个命令中,awk的第一个文件参数是-,意思是stdin。tr的输出通过管道传输到awk以提供这个stdin。

这与以前的解决方案相同,但避免了进程替换。

票数 4
EN

Stack Overflow用户

发布于 2014-09-18 04:12:59

使用awk

代码语言:javascript
复制
$ cat Records
xxxx xxxx 1234 xxxx
xxxx xxxx 5678 xxxx

$ cat Parameter
1234,9001
5678,9020

$ awk 'NR==FNR{a[$1]=$2;next}{$3=a[$3]}1' FS="," Parameter FS=" " Records
xxxx xxxx 9001 xxxx
xxxx xxxx 9020 xxxx

在文件名之前设置字段分隔符变量,以便为该特定文件设置它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25903975

复制
相关文章

相似问题

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