我正在寻找一个解决方案与sed命令搜索和替换字符串的csv文件的最后一列,这里的搜索模式,我从一个数组调用.下面的脚本寻找第三和第四列,这导致在输出不匹配.
在这里我需要你的帮助,我可以告诉sed只看最后一列。
file1.txt
QCQP
TXTT
QCQT
YYTH
file2.txt
TTYY
JPEK
QCQC
TTYE
原始输出.csv
[Input]
String1
[Data]
ID,Name,Class,Context,Code
1,jack,6,QCQT,QCQP
2,john,5,QCQP,TXTT
3,jake,3,TTXX,QCQT
4,jone,3,TXTT,YYTH
下面是我在此设置中使用的脚本,但这里的sed命令搜索所有匹配项,而不是查找由逗号分隔的最后一列。
#!/bin/bash
filein=file1.txt
fileout=file2.txt
pre=$(cat $filein)
post=$(cat $fileout)
prear=($pre)
postar=($post)
typeset -p prear postar
for (( i=0; i<${#prear[@]}; ++i )); do
sed -i -e 's/'"${prear[$i]}"'/'"${postar[$i]}"'/g' output.csv
done
预期结果
output.csv
[Input]
String1
[Data]
ID,Name,Class,Context,Code
1,jack,6,QCQT,TTYY
2,john,5,QCQP,JPEK
3,jake,3,TTXX,QCQC
4,jone,3,TXTT,TTYE
使用awk命令,我可以找出类似的情况,但下面的工作与一个单一的变量,也不是与逗号分隔符,但与数组这失败。
awk -F "," '{gsub(c,d,$(NF)); print}' c=$a d=$b file.txt
另外,如果使用awk或gawk,我需要指定变量名作为输入。因为输入文件“file1.txt,file2.txt”和输出文件的.csv文件名并不总是相同的。实际上,我接受它们作为脚本中的第一个,第二个和第三个参数,然后从该变量中阅读内容。
例如:-这里用户可以选择任何名称文件作为输入。这里我不知道如何在awk/gawk中调用数组
#!/bin/bash
input1=$1
input2=$2
Output=$3
inp1=$(cat $input1)
inp2=$(cat $input2)
out=$(cat $Output)
inp1ar=($inp1)
inp2ar=($inp2)
outar=($out)
I would like to expect to call the array variable to read the contents
gawk -i inplace '
.. some condition ..
' {inp1ar} {inp2ar} {outar}
请告知
谢谢杰
3条答案
按热度按时间b09cbbtk1#
我会使用awk来实现这个。
第一个
但是使用sed,您可以使用file 1和file动态构建一个sed程序,然后将其应用于原始csv
逐段执行,看看它们是如何组合在一起的。
要使用“前缀”行容纳更新的csv文件:(未测试)
给定您最近编辑的脚本的框架:
首先,引用变量名称至关重要:
cat "$input1"
--如果不这样做,将导致您报告“I 'm falling as argument or some other variable name”(我作为参数或其他变量名失败)。接下来,不需要读取脚本bash部分中的文件内容:awk会这么做。
看到变量是如何在所有地方都用(双)引号括起来的吗?
68de4m5k2#
在修复了与
pre[]
和post[]
数组填充相关的问题之后,OP的bash
代码现在应该可以正常运行,因此,请查看awk
解决方案...假设条件:
file1.txt
和file2.txt
具有相同的行数(即,file1.txt
中的每一行在file2.txt
中都有一个匹配的行)output.csv
中显示为分隔符)output.csv
开始的第5列在file1.txt
中没有匹配,则不处理该行[Data]
段是output.csv
中的最后一段(否则,一旦[Data]
段已被处理,OP可能需要添加逻辑以关闭替换逻辑)向
output.csv
添加在file1.txt
中没有匹配项的行:我们将利用
paste
将file1.txt
和file2.txt
合并为一个数据集:一个
awk
创意:这会产生:
虽然OP的
sed
代码更新了原始文件(由于使用了-i
标志),但这个awk
解决方案 * 不 * 更新原始文件。如果OP需要更新原始文件,那么有两个选项:mv tempfile output.csv
GNU awk
,我们可以使用inplace
模块假设
GNU awk
可用,我们可以对awk
代码进行以下更改,以支持output.csv
的更新:其中:
-i inplace
-加载inplace
模块inplace::enable=0
-对包含paste
结果的“文件”禁用inplace
处理inplace::enable=1
-为output.csv
文件启用inplace
处理这会产生:
eulz3vhy3#
这个
sed
应该可以:但是IMHO
awk
更适合这个任务。