여러 CSV 파일의 각 줄에 있는 CSV 파일 내의 파일 이름을 연결합니다.

여러 CSV 파일의 각 줄에 있는 CSV 파일 내의 파일 이름을 연결합니다.

많은 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"

인용하다

http://www.unix.com/unix-for-dummies-questions-and-answers/150545-merge-files-add-file-name-end-each-line.html

답변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.

관련 정보