脚本循环并组合两个文本文件

时间:2020-01-15 22:07:44

标签: shell

我有两个.csv文件,试图通过脚本“相乘”。第一个文件是人的信息,基本上看起来像这样:

First Name, Last Name, Email, Phone
Sally,Davis,sdavis@nobody.com,555-555-5555
Tom,Smith,tsmith@nobody.com,555-555-1212

第二个文件是帐号,看起来像这样:

AccountID
1001
1002

基本上,我想获取每个帐户ID的每个名称。因此,如果我在第一个文件中有10个名称,在第二个文件中有10个帐户ID,则最终应在结果文件中包含100行,并使其如下所示:

First Name, Last Name, Email, Phone, AccountID
Sally,Davis,sdavis@nobody.com,555-555-5555, 1001
Tom,Smith,tsmith@nobody.com,555-555-1212, 1001
Sally,Davis,sdavis@nobody.com,555-555-5555, 1002
Tom,Smith,tsmith@nobody.com,555-555-1212, 1002

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:0)

您可以简单地为每个要通过其ID计数重复的值编写一个for循环,并附加说明,但顺序相反。 那是行不通的还是您没有尝试过?

答案 1 :(得分:0)

如果python为您工作,这是一个执行此操作的脚本:

def main():
    f1 = open("accounts.txt", "r")
    f1_total_lines = sum(1 for line in open('accounts.txt'))
    f2_total_lines = sum(1 for line in open('info.txt'))

    f1_line_counter = 1;
    f2_line_counter = 1;

    f3 = open("result.txt", "w")
    f3.write('First Name, Last Name, Email, Phone, AccountID\n')

    for line_account in f1.readlines():
        f2 = open("info.txt", "r")
        for line_info in f2.readlines():
            parsed_line_account = line_account
            parsed_line_info = line_info.rstrip() # we have to trim the newline character from every line from the 'info' file
            if f2_line_counter == f2_total_lines: # ...for every but the last line in the file (because it doesn't have a newline character)
                parsed_line_info = line_info
            f3.write(parsed_line_info + ',' + parsed_line_account)

            if f1_line_counter == f1_total_lines:
                f3.write('\n')

            f2_line_counter = f2_line_counter + 1

        f1_line_counter = f1_line_counter + 1
        f2_line_counter = 1 # reset the line counter to the first line

    f1.close()
    f2.close()
    f3.close()

if __name__ == '__main__':
    main()

我使用的文件如下:

info.txt

Sally,Davis,sdavis@nobody.com,555-555-555
Tom,Smith,tsmith@nobody.com,555-555-1212
John,Doe,jdoe@nobody.com,555-555-3333

accounts.txt

1001
1002
1003

答案 2 :(得分:0)

如果您打算复制Account_ID

如果您打算将每个Account_ID添加到信息文件中的每个记录,则可以使用一个简短的awk解决方案,例如

$ awk -F, '
    FNR==NR{a[i++]=$0}
    FNR!=NR{b[j++]=$0}
    END{print a[0] ", " b[0]
        for (k=1; k<i; k++)
            for (m=1; m<i; m++)
                print a[m] ", " b[k]}
' info id
First Name, Last Name, Email, Phone, AccountID
Sally,Davis,sdavis@nobody.com,555-555-5555, 1001
Tom,Smith,tsmith@nobody.com,555-555-1212, 1001
Sally,Davis,sdavis@nobody.com,555-555-5555, 1002
Tom,Smith,tsmith@nobody.com,555-555-1212, 1002

第一个文件中的行(当文件记录号等于记录号,例如FNR==NR时)存储在数组a中,第二个文件中的行(当{ {1}}存储在数组FNR!=NR中,然后按照所需顺序在b规则中组合并输出。


帐户ID不重复

由于END通常是唯一信息,因此,如果您不打算在每个记录的末尾复制每个ID,则无需循环。 Account_ID命令可以为您完成此任务。对于您的信息文件为paste,帐户ID文件为info的情况,它很简单:

id

注意:$ paste -d, info id First Name, Last Name, Email, Phone,AccountID Sally,Davis,sdavis@nobody.com,555-555-5555,1001 Tom,Smith,tsmith@nobody.com,555-555-1212,1002 选项仅将分隔符设置为逗号)

似乎比重新发明轮子容易得多。

答案 3 :(得分:0)

可以很容易地通过数组完成

OLD=$IFS; IFS=$'\n'
ar1=( $(cat file1) )
ar2=( $(cat file2) )
IFS=$OLD
ind=${!ar1[@]}

for i in $ind; { echo "${ar1[$i]}, ${ar2[$i]}"; }