여러 파일의 열을 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
$4
NR
,\?$
,
test.csv
sed
awk
system()
기능.
노트즉 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