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

时间:2017-12-19 04:19:13

标签: shell for-loop awk

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

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

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

$cat justPid.csv
aaaa
bbbb
cccc

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

有什么建议吗?

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

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

        <div class="warn">
<div class="row container pv2">
    <div class="col xs12">
        <div class="display-table-cell b-text_copy-4 pr1">
            <i class="msg-icon b-icon b-icon-warn"></i>
        </div>
        <div class="display-table-cell b-text_copy-2 b-text_weight-bold">
                    <div> I NEED THIS TEXT <a href=https://somelink/contact.html target=_blank>contact us</a>.</div>

2 个答案:

答案 0 :(得分: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 command Don't Read Lines With For

答案 1 :(得分: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,我们可以解决这个问题。