如何通过依赖另一个文件来更改记录的第三个字段?可以使用awk吗?
对不起,我是新手。
示例:记录
xxxx xxxx 1234 xxxx
xxxx xxxx 5678 xxxx参数(另一个文件)
1234,9001
5678,9020我的预期产出是
xxxx xxxx 9001 xxxx
xxxx xxxx 9020 xxxx一瞥我的代码
#!/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`发布于 2014-09-18 04:12:20
$ 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都支持的。要在不使用进程替换的情况下运行此操作:
$ 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。
这与以前的解决方案相同,但避免了进程替换。
发布于 2014-09-18 04:12:59
使用awk
$ 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在文件名之前设置字段分隔符变量,以便为该特定文件设置它。
https://stackoverflow.com/questions/25903975
复制相似问题