2

似たような名前のファイルがたくさんあります

DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out
DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out
DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out

ファイル名から.csv(1または2)の前の番号を取得し、TAB区切り文字を使用してファイル内のすべての行の最後に配置する必要があります。

私はこのコードを書きました、それは私が必要とする数を見つけます、しかし私はこの数をファイルに入れる方法を知りません。ファイル名にスペースがあります。そのため、スクリプトが壊れています。

また、ファイルのスクリプトリストに送信する方法もわかりません。現在、私は1つのファイルのみを処理しています。

私のコード:

#!/bin/sh
string="DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out" 
out=$(echo $string | awk 'BEGIN {FS="_"};{print substr ($7,0,1)}')
awk ' { print $0"\t$out" } ' $string
4

5 に答える 5

2
for file in *
do
   sfx=$(echo "$file" | sed 's/.*_\(.*\).csv.*/\1/')
   sed -i "s/$/\t$sfx/" "$file"
done
于 2012-11-01T14:36:52.073 に答える
1

sedの使用:

$ sed 's/.*_\(.*\).csv.*/&\t\1/' file
DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out     1
DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out     2
DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out     1

多くのファイルに対してこれを作成するには:

sed 's/.*_\(.*\).csv.*/&\t\1/' file1 file2 file3

また

sed 's/.*_\(.*\).csv.*/&\t\1/' file*

これを変更するには、同じファイルに保存します(GNU sedを使用している場合)。

sed -i 's/.*\(.\).csv.*/&\t\1/' file
于 2012-11-01T11:08:00.697 に答える
1

テストされていませんが、これで必要な処理が実行されます(.csvの前の番号を抽出し、その番号を.outファイルのすべての行の末尾に追加します)

awk 'FNR==1 { split(FILENAME, field, /[_.]/) } 
     { print $0"\t"field[7] > FILENAME"_aaaa" }' *.out

for file in *_aaaa; do mv "$file" "${file/_aaaa}"; done 
于 2012-11-01T12:46:13.147 に答える
0

私が正しく理解していれば、ファイル名の番号をそのファイルのすべての行に追加する必要があります-これでうまくいくはずです:

#!/bin/bash
while [[ 0 < $# ]]; do
    num=$(echo "$1" | sed -r 's/.*_([0-9]+).csv.*/\t\1/' )
    #awk -e "{ print \$0\"\t${num}\"; }" < "$1" > "$1.new"
    #sed -r "s/$/\t$num/" < "$1" > "$1.mew"
    #sed -ri "s/$/\t$num/" "$1"
    shift
done

スクリプトを実行し、処理するファイルの名前をスクリプトに付けます。$#は、ループの最後でshift最初の引数を削除し、他の引数をシフトするによってデクリメントされるスクリプトのコマンドライン引数の数です。ファイル名から番号を抽出し、コメント付きの3行のいずれかを選択して追加します。awkを使用すると柔軟性が高まり、最初のsedで新しいファイルが作成され、2番目のsedでそれらがインプレースで処理されます(GNU sedを実行している場合)。 。

于 2012-11-01T11:47:30.103 に答える
0

awkの代わりに、sedまたはcoreutilsを使用することをお勧めします。

ファイル名から番号を取得し、さまざまなgrepを使用します。

num=$(<<<filename grep -Eo '[^_]+\.csv' | cut -d. -f1)

<<<filenameと同等echo filenameです。

sed付き

GNUsednumで各行に追加します。

sed "s/\$/\t$num" filename

-iスイッチを使用してfilename、インプレースで変更します。

ペースト付き

このメソッドのファイルの長さも知っておく必要があります。

len=$(<filename wc -l)

組み合わせfilenamenum貼り付けます:

paste filename <(seq $len | while read; do echo $num; done)

完全な例

for filename in DWH_Export*; do 
  num=$(echo $filename | grep -Eo '[^_]+\.csv' | cut -d. -f1)
  sed -i "s/\$/\t$num" $filename
done
于 2012-11-01T12:46:36.997 に答える