我有两个.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
任何帮助将不胜感激
答案 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]}"; }