使用awk和for循环替换文件名

问题描述 投票:0回答:2

嗨,我正在尝试使用变量替换编写动态文件名,我无法弄清楚我在这里缺少什么。

for i in `cat justPid.csv`
 do 
 awk -v var="$i" -F"," '{if ($1==var) {print $0 }}' uniqPid.csv > "$i"file.txt
done

我也尝试了下面的一个和许多其他组合,但它不会打印基于$ i的多个文件名。

for i in `cat justPid.csv`
 do 
 awk -v var="$i" -F"," '{if ($1==var) {print $0 }}' uniqPid.csv > ${i}_file.txt
done

有什么建议?

编辑:我的初衷是根据PID(文件中的标识符)将27gb文件拆分为可管理的块,以便可以将其加载到R Studio进行分析。我正在我的笔记本电脑上工作,而不是在服务器上,因此需要将它们分成小文件。我也在Windows上使用(“new”)ubuntu bash shell。

我正在处理的较小的测试文件看起来就像Jithin发布的那样。我会尝试这些建议,并会更新这篇文章!

$cat justPid.csv
aaaa
bbbb
cccc

$cat uniqPid.csv
aaaa,1234567890
aaaa,aaaaaaaaaa
aaaa,bbbbbbbbbb
bbbb,1234567890
cccc,1234567890
dddd,cccccccccc
ffff,1234567890
shell for-loop awk
2个回答
1
投票

我不太确定这是你在寻找什么,让我们

输入文件

$cat justPid.csv
aaaa
bbbb
cccc

$cat uniqPid.csv
aaaa,1234567890
aaaa,aaaaaaaaaa
aaaa,bbbbbbbbbb
bbbb,1234567890
cccc,1234567890
dddd,cccccccccc
ffff,1234567890

使用for loop的脚本

for i in $(cat justPid.csv)
do
    awk -v var=${i} -F, '$1==var' uniqPid.csv > ${i}_file.txt
done

使用while loop的脚本

while read -r i
do
    awk -v var=${i} -F, '$1==var' uniqPid.csv > ${i}_file.txt
done < justPid.csv

产量

$ cat aaaa_file.txt
aaaa,1234567890
aaaa,aaaaaaaaaa
aaaa,bbbbbbbbbb

$ cat bbbb_file.txt
bbbb,1234567890

$ cat cccc_file.txt
cccc,1234567890

注意:不建议使用for loop,请参阅链接Use a while loop and the read commandDon't Read Lines With For


0
投票

没有样本输入/输出它只是一个未经测试的猜测,但我想你所需要的只是::

awk -F, '{print > ($1"_file.txt")}' uniqPid.csv

或者可能:

awk -F, 'NR==FNR{a[$1];next} $1 in a{print > ($1"_file.txt")}' justPid.csv uniqPid.csv

到目前为止,我根本没有看到任何循环的原因。您可能需要在出发时关闭输出文件,但是如果/当您提供样本输入/输出并告诉我们您是否有GNU awk时我们可以解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.