많은 CSV 파일이 있고 각 파일의 각 행에 각 특정 CSV 파일의 파일 이름이 필요합니다.
원본 파일 내용 abc123.csv
:
ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6
새 파일 콘텐츠:
ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv
모든 CSV 파일은 동일한 디렉터리에 있습니다. 각 파일의 이름을 지정하고 싶지 않습니다.
답변1
sed
더 간단하고, 더 쉽고, 더 빠르게 사용할 수 있습니다 xargs
. 여기서는 sed
추가 셸 도구를 피하기 위해 내부 편집이 사용됩니다.
$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
이것이 출력입니다.
$ cat file{1..5}.txt
ColVal_1;ColVal_2;ColVal_3;file1.txt
ColVal_4;ColVal_5;ColVal_6;file1.txt
ColVal_1;ColVal_2;ColVal_3;file2.txt
ColVal_4;ColVal_5;ColVal_6;file2.txt
ColVal_1;ColVal_2;ColVal_3;file3.txt
ColVal_4;ColVal_5;ColVal_6;file3.txt
ColVal_1;ColVal_2;ColVal_3;file4.txt
ColVal_4;ColVal_5;ColVal_6;file4.txt
ColVal_1;ColVal_2;ColVal_3;file5.txt
ColVal_4;ColVal_5;ColVal_6;file5.txt
답변2
다음 sed
과 같은 작업을 수행할 수 있습니다.
for f in *.csv
do
sed -i 's/$/ '"$f"'/' "$f"
done
시험
디렉토리 중 하나에 여러 csv
파일을 만들었습니다.
cat csv1.csv
this
is
first
csv
file
##Second CSV file
cat csv2.csv
this
is
second
csv
file
이제 위에서 언급한 명령을 실행했습니다. 명령을 실행하면 파일은 다음과 같습니다.
cat csv1.csv
this csv1.csv
is csv1.csv
first csv1.csv
csv csv1.csv
file csv1.csv
##Second CSV file
cat csv2.csv
this csv2.csv
is csv2.csv
second csv2.csv
csv csv2.csv
file csv2.csv
네가 원한다면세미콜론sed
파일 이름을 추가하기 전에 명령에 추가 할 수 있습니다 . 변경 sed
명령은 다음과 같습니다.
sed -i 's/$/ '";$f"'/' "$f"
인용하다
답변3
어때요?:-
for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done
mv
최신 버전이 있으면 이를 피할 수 있지만 awk
이식성이 더 좋을 수 있습니다.
답변4
그리고 perl
:
$ perl -i.bak -ple '$_ .= ";"$ARGV' file.csv
ColVal_1;ColVal_2;ColVal_3;file.csv
ColVal_4;ColVal_5;ColVal_6;file.csv
에서 perldoc -v '$ARGV'
:
$ARGV Contains the name of the current file when reading from "<>".
이를 사용하여 *.csv
현재 디렉터리의 모든 파일을 처리할 수 있습니다. -i.bak
모든 파일을 제자리에서 편집하고 *.csv.bak
.