여러 파일의 열을 .csv에 추가

여러 파일의 열을 .csv에 추가

여러 파일의 열을 csv 파일에 추가하려고 합니다. 이것이 제가 지금까지 시도한 것이지만 결국 빈 파일이 되거나 마지막 파일의 열만 남게 됩니다.

    while read i; do
        awk '{print $4}' ${i}.txt > ${i}_temp
        awk 'NR==FNR{a[NR]=$0;next}{print a[FNR],$0}' OFS=, test.csv ${i}_temp >> test.csv
    done < file_list

파일 목록은 단지 접근 번호 목록일 뿐입니다:

NA123
NA124
NA125
...

해당 텍스트 파일에는 4개의 열이 있으며 마지막 열을 복사하여 csv 파일의 다음 열로 추가하고 싶습니다. 파일의 내용은 다음과 같습니다.

NA123.txt:
April-18    10:00    18:00    8
April-19    09:00    19:00    10
April-20    11:00    16:00    5
...
NA124.txt:
April-18    14:00    18:00    4
April-19    09:00    15:00    6
April-20    07:00    16:00    9
...
NA125.txt:
April-18    10:00    22:00    12
April-19    09:00    12:00    3
April-20    06:00    16:00    10
...
test.csv:
0,
1,
2,
...

나는 출력을 다음과 같이 원한다:

0,8,4,12
1,10,6,3
2,5,9,10
...

이를 위해 어떤 변경이 필요합니까? 아니면 더 효율적인 방법이 있습니까?

답변1

노력하다:

 <file_list xargs -I % awk '
     { system("sed -i '\'' " NR "s/,\\?$/," $4 "/'\'' test.csv" ) }' %.txt

xargs파일 이름은 file_list 파일에서 읽혀 지며 filename에 포함된 접미사를 사용하여 awk호출되는 Xarags 변수 에 제공됩니다 %..txt

with sed '#s/$/something/' test.csv"명령은 파일의 특정 줄 번호 끝에 추가하는 데 사용됩니다. something예를 들어 위의 경우 특정 줄 번호에 추가해야 하는 문자열은 다음에서 가져온 것입니다. 귀하의 .The 명령이 '에 의해 호출되었기 때문에 내가 사용한 쉼표가 있습니다.$#test.csv$4NR,\?$,test.csvsedawksystem()기능.

노트sed, 터미널 출력이 표시되지 않도록 변경 사항을 기록하려면 다음을 수행합니다.

$ cat test.csv
0,8,4,12
1,10,6,3
2,5,9,10

답변2

어쩌면 붙여넣기와 추가 임시 파일을 사용해 볼 수도 있습니다.

touch temp

while read i; do
        awk '{print $4}' ${i}.txt > ${i}_temp
        paste temp ${i}_temp > test.csv
        cp test.csv temp
done < file_list

rm temp

답변3

왜 그냥 사용하지 않습니까 paste?

$ cat in1; cat in2
row1,col2,col3
row2,col2,col3
row3,col2,col3
row4,col2,col3
row1
row2
row3
row4
$ paste -d, in1 in2
row1,col2,col3,row1
row2,col2,col3,row2
row3,col2,col3,row3
row4,col2,col3,row4

관련 정보