複数のファイルの列を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
withsed '#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