txt 형식의 테이블이 포함된 디렉토리가 있고 파일 이름을 두 번째 열의 헤더로 추가하고 싶습니다. 예를 들면 다음과 같습니다.
File_1.txt
row_1 1
row_2 0
row_3 1
row_4 1
row_5 1
row_6 1
출력.txt
rows file_1
row_1 1
row_2 0
row_3 1
row_4 1
row_5 1
나는 이런 것을 생각하고 있었다.
sed 1 's/top_row/$file_name/1' < "$file";
답변1
이는 한 줄을 작성한 rows file_1.txt
다음 전체 파일을 출력합니다.
echo "rows $file"; cat "$file"
위와 같이 출력에서 파일 확장자를 제거하려면 다음을 사용하십시오 basename
.
echo "rows $(basename $file .txt)"; cat "$file"
답변2
for file in ./file_*.txt
do
awk 'NR==1 { print "rows", FILENAME }; 1' "$file" > temp && mv temp "$file"
done
-i
또는 내부 편집을 지원하는 sed를 사용하십시오.
for file in ./file_*.txt
do
sed -i "1i\
rows $file" "$file"
done
답변3
file_*.txt
처리하려는 모든 파일과 일치하고 파일이 탭을 구분 기호로 사용한다고 가정합니다 .
tmpfile=$(mktemp)
for filename in file_*.txt; do
{ printf 'rows\t%s\n' "$filename"; cat "$filename"; } >$tmpfile &&
mv "$tmpfile" "$filename"
done
이는 일치하는 파일 이름을 반복하고 각 파일에 대해 헤더와 파일 자체의 내용이 포함된 줄을 임시 파일로 출력하여 모든 것이 제대로 진행되면 원본 파일을 대체합니다.
이렇게 하면 원본 파일이 수정됩니다. 귀하의 질문에서 당신은 예제를 제공하고 이것이 에 출력되어야 한다고 말했지만 output.txt
결과를 다른 모든 파일에 쓸 위치가 명확하지 않았기 때문에 이 접근 방식을 사용했습니다.
답변4
단지 재미를 위한 이해할 수 없는 펄
perl -i -pe '$.==1&&do{($f=$ARGV)=~s/\..*?$//;$_="rows $f\n$_"};close ARGV if eof' *.txt